diff options
author | Sam T <pxqr.sta@gmail.com> | 2013-05-19 12:08:42 +0400 |
---|---|---|
committer | Sam T <pxqr.sta@gmail.com> | 2013-05-19 12:08:42 +0400 |
commit | 6c0d145b82a6372ba98c60f3bf398f8da8a8c89b (patch) | |
tree | d3bbaeeba263c92d20d6ff5b68b57d58f7c84407 /src | |
parent | 2483bec57a19a9f60b84413ba2a9c9953aab9817 (diff) |
+ Add instances for Version and Set.
Diffstat (limited to 'src')
-rw-r--r-- | src/Data/BEncode.hs | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/Data/BEncode.hs b/src/Data/BEncode.hs index 9b72604..d4997fb 100644 --- a/src/Data/BEncode.hs +++ b/src/Data/BEncode.hs | |||
@@ -78,6 +78,8 @@ import Data.Traversable (traverse) | |||
78 | import Data.Word (Word8, Word16, Word32, Word64, Word) | 78 | import Data.Word (Word8, Word16, Word32, Word64, Word) |
79 | import Data.Map (Map) | 79 | import Data.Map (Map) |
80 | import qualified Data.Map as M | 80 | import qualified Data.Map as M |
81 | import Data.Set (Set) | ||
82 | import qualified Data.Set as S | ||
81 | import Data.Attoparsec.ByteString.Char8 (Parser) | 83 | import Data.Attoparsec.ByteString.Char8 (Parser) |
82 | import qualified Data.Attoparsec.ByteString.Char8 as P | 84 | import qualified Data.Attoparsec.ByteString.Char8 as P |
83 | import Data.ByteString (ByteString) | 85 | import Data.ByteString (ByteString) |
@@ -89,8 +91,10 @@ import qualified Data.ByteString.Builder as B | |||
89 | import qualified Data.ByteString.Builder.Prim as BP () | 91 | import qualified Data.ByteString.Builder.Prim as BP () |
90 | import Data.Text (Text) | 92 | import Data.Text (Text) |
91 | import qualified Data.Text.Encoding as T | 93 | import qualified Data.Text.Encoding as T |
94 | import Data.Version | ||
92 | import Text.PrettyPrint.ANSI.Leijen (Pretty, Doc, pretty, (<+>), (</>)) | 95 | import Text.PrettyPrint.ANSI.Leijen (Pretty, Doc, pretty, (<+>), (</>)) |
93 | import qualified Text.PrettyPrint.ANSI.Leijen as PP | 96 | import qualified Text.PrettyPrint.ANSI.Leijen as PP |
97 | import qualified Text.ParserCombinators.ReadP as ReadP | ||
94 | 98 | ||
95 | type Dict = Map ByteString BEncode | 99 | type Dict = Map ByteString BEncode |
96 | 100 | ||
@@ -190,6 +194,15 @@ instance BEncodable a => BEncodable (Map ByteString a) where | |||
190 | fromBEncode _ = decodingError "dictionary" | 194 | fromBEncode _ = decodingError "dictionary" |
191 | {-# INLINE fromBEncode #-} | 195 | {-# INLINE fromBEncode #-} |
192 | 196 | ||
197 | instance (Eq a, BEncodable a) => BEncodable (Set a) where | ||
198 | {-# SPECIALIZE instance (Eq a, BEncodable a) => BEncodable (Set a) #-} | ||
199 | toBEncode = BList . map toBEncode . S.toAscList | ||
200 | {-# INLINE toBEncode #-} | ||
201 | |||
202 | fromBEncode (BList xs) = S.fromAscList <$> traverse fromBEncode xs | ||
203 | fromBEncode _ = decodingError "Data.Set" | ||
204 | {-# INLINE fromBEncode #-} | ||
205 | |||
193 | instance BEncodable () where | 206 | instance BEncodable () where |
194 | {-# SPECIALIZE instance BEncodable () #-} | 207 | {-# SPECIALIZE instance BEncodable () #-} |
195 | toBEncode () = BList [] | 208 | toBEncode () = BList [] |
@@ -252,6 +265,17 @@ instance (BEncodable a, BEncodable b, BEncodable c, BEncodable d, BEncodable e) | |||
252 | fromBEncode _ = decodingError "Unable to decode a tuple5" | 265 | fromBEncode _ = decodingError "Unable to decode a tuple5" |
253 | {-# INLINE fromBEncode #-} | 266 | {-# INLINE fromBEncode #-} |
254 | 267 | ||
268 | instance BEncodable Version where | ||
269 | {-# SPECIALIZE instance BEncodable Version #-} | ||
270 | {-# INLINE toBEncode #-} | ||
271 | toBEncode = toBEncode . BC.pack . showVersion | ||
272 | |||
273 | fromBEncode (BString bs) | ||
274 | | [(v, _)] <- ReadP.readP_to_S parseVersion (BC.unpack bs) | ||
275 | = return v | ||
276 | fromBEncode _ = decodingError "Data.Version" | ||
277 | {-# INLINE fromBEncode #-} | ||
278 | |||
255 | dictAssoc :: [(ByteString, BEncode)] -> BEncode | 279 | dictAssoc :: [(ByteString, BEncode)] -> BEncode |
256 | dictAssoc = BDict . M.fromList | 280 | dictAssoc = BDict . M.fromList |
257 | {-# INLINE dictAssoc #-} | 281 | {-# INLINE dictAssoc #-} |