summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSam T <pxqr.sta@gmail.com>2013-05-19 12:08:42 +0400
committerSam T <pxqr.sta@gmail.com>2013-05-19 12:08:42 +0400
commit6c0d145b82a6372ba98c60f3bf398f8da8a8c89b (patch)
treed3bbaeeba263c92d20d6ff5b68b57d58f7c84407 /src
parent2483bec57a19a9f60b84413ba2a9c9953aab9817 (diff)
+ Add instances for Version and Set.
Diffstat (limited to 'src')
-rw-r--r--src/Data/BEncode.hs24
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)
78import Data.Word (Word8, Word16, Word32, Word64, Word) 78import Data.Word (Word8, Word16, Word32, Word64, Word)
79import Data.Map (Map) 79import Data.Map (Map)
80import qualified Data.Map as M 80import qualified Data.Map as M
81import Data.Set (Set)
82import qualified Data.Set as S
81import Data.Attoparsec.ByteString.Char8 (Parser) 83import Data.Attoparsec.ByteString.Char8 (Parser)
82import qualified Data.Attoparsec.ByteString.Char8 as P 84import qualified Data.Attoparsec.ByteString.Char8 as P
83import Data.ByteString (ByteString) 85import Data.ByteString (ByteString)
@@ -89,8 +91,10 @@ import qualified Data.ByteString.Builder as B
89import qualified Data.ByteString.Builder.Prim as BP () 91import qualified Data.ByteString.Builder.Prim as BP ()
90import Data.Text (Text) 92import Data.Text (Text)
91import qualified Data.Text.Encoding as T 93import qualified Data.Text.Encoding as T
94import Data.Version
92import Text.PrettyPrint.ANSI.Leijen (Pretty, Doc, pretty, (<+>), (</>)) 95import Text.PrettyPrint.ANSI.Leijen (Pretty, Doc, pretty, (<+>), (</>))
93import qualified Text.PrettyPrint.ANSI.Leijen as PP 96import qualified Text.PrettyPrint.ANSI.Leijen as PP
97import qualified Text.ParserCombinators.ReadP as ReadP
94 98
95type Dict = Map ByteString BEncode 99type 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
197instance (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
193instance BEncodable () where 206instance 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
268instance 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
255dictAssoc :: [(ByteString, BEncode)] -> BEncode 279dictAssoc :: [(ByteString, BEncode)] -> BEncode
256dictAssoc = BDict . M.fromList 280dictAssoc = BDict . M.fromList
257{-# INLINE dictAssoc #-} 281{-# INLINE dictAssoc #-}