summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSam T <sta.cs.vsu@gmail.com>2013-04-01 06:03:23 +0400
committerSam T <sta.cs.vsu@gmail.com>2013-04-01 06:03:23 +0400
commit6abead88acb3939444cd04ca8c68e939e7ac44c8 (patch)
treea3db81ee854c103e771244d87cb00107bdbd97c1 /src
parent1a73f9857a4fc86238308b6345c6cdf9d7b6c9cd (diff)
+ BEncodable
Diffstat (limited to 'src')
-rw-r--r--src/Data/BEncode.hs89
1 files changed, 65 insertions, 24 deletions
diff --git a/src/Data/BEncode.hs b/src/Data/BEncode.hs
index fceb88b..aa34ab6 100644
--- a/src/Data/BEncode.hs
+++ b/src/Data/BEncode.hs
@@ -1,13 +1,12 @@
1-- | This module is intented to be imported qualified. 1-- | This module is intented to be imported qualified.
2{-# LANGUAGE FlexibleInstances #-}
2module Data.BEncode 3module Data.BEncode
3 ( -- ^ Datatype 4 ( -- ^ Datatype
4 BEncode(..) 5 BEncode(..)
5 6
6 -- ^ Construction 7 -- ^ Construction && Destructuring
7 , string, integer, list, dict 8 , BEncodable (..), dictAssoc
8 , int, charstring, dictAssoc
9 9
10 -- ^ Destructuring
11 -- ^ Serialization 10 -- ^ Serialization
12 , encode, decode 11 , encode, decode
13 12
@@ -21,7 +20,8 @@ module Data.BEncode
21 20
22import Control.Applicative 21import Control.Applicative
23import Data.Int 22import Data.Int
24import Data.Foldable 23import Data.Foldable (foldMap)
24import Data.Traversable (traverse)
25import Data.Monoid ((<>)) 25import Data.Monoid ((<>))
26import Data.Map (Map) 26import Data.Map (Map)
27import qualified Data.Map as M 27import qualified Data.Map as M
@@ -50,33 +50,74 @@ data BEncode = BInteger Int64
50 | BDict Dict 50 | BDict Dict
51 deriving (Show, Read, Eq, Ord) 51 deriving (Show, Read, Eq, Ord)
52 52
53integer :: Integer -> BEncode 53class BEncodable a where
54integer = BInteger . fromIntegral 54 toBEncode :: a -> BEncode
55{-# INLINE integer #-} 55 fromBEncode :: BEncode -> Maybe a
56-- isEncodable :: BEncode -> Bool
56 57
57string :: ByteString -> BEncode 58instance BEncodable BEncode where
58string = BString 59 toBEncode = id
59{-# INLINE string #-} 60 {-# INLINE toBEncode #-}
60 61
61list :: [BEncode] -> BEncode 62 fromBEncode = Just
62list = BList 63 {-# INLINE fromBEncode #-}
63{-# INLINE list #-}
64 64
65dict :: Dict -> BEncode 65instance BEncodable Int where
66dict = BDict 66 toBEncode = BInteger . fromIntegral
67{-# INLINE dict #-} 67 {-# INLINE toBEncode #-}
68 68
69 fromBEncode (BInteger i) = Just (fromIntegral i)
70 fromBEncode _ = Nothing
71 {-# INLINE fromBEncode #-}
69 72
70int :: Int -> BEncode 73instance BEncodable Integer where
71int = integer . fromIntegral 74 toBEncode = BInteger . fromIntegral
72{-# INLINE int #-} 75 {-# INLINE toBEncode #-}
73 76
74charstring :: String -> BEncode 77 fromBEncode (BInteger i) = Just (fromIntegral i)
75charstring = string . B.pack . map (toEnum . fromEnum) 78 fromBEncode _ = Nothing
76{-# INLINE charstring #-} 79 {-# INLINE fromBEncode #-}
80
81instance BEncodable ByteString where
82 toBEncode = BString
83 {-# INLINE toBEncode #-}
84
85 fromBEncode (BString s) = Just s
86 fromBEncode _ = Nothing
87 {-# INLINE fromBEncode #-}
88
89{-
90instance BEncodable String where
91 toBEncode = BString . BC.pack
92 {-# INLINE toBEncode #-}
93
94 fromBEncode (BString s) = Just (BC.unpack s)
95 fromBEncode _ = Nothing
96 {-# INLINE fromBEncode #-}
97-}
98
99instance BEncodable a => BEncodable [a] where
100 {-# SPECIALIZE instance BEncodable [BEncode] #-}
101
102 toBEncode = BList . map toBEncode
103 {-# INLINE toBEncode #-}
104
105 fromBEncode (BList xs) = mapM fromBEncode xs
106 fromBEncode _ = Nothing
107 {-# INLINE fromBEncode #-}
108
109instance BEncodable a => BEncodable (Map ByteString a) where
110 {-# SPECIALIZE instance BEncodable (Map ByteString BEncode) #-}
111
112 toBEncode = BDict . M.map toBEncode
113 {-# INLINE toBEncode #-}
114
115 fromBEncode (BDict d) = traverse fromBEncode d
116 fromBEncode _ = Nothing
117 {-# INLINE fromBEncode #-}
77 118
78dictAssoc :: [(ByteString, BEncode)] -> BEncode 119dictAssoc :: [(ByteString, BEncode)] -> BEncode
79dictAssoc = dict . M.fromList 120dictAssoc = BDict . M.fromList
80{-# INLINE dictAssoc #-} 121{-# INLINE dictAssoc #-}
81 122
82 123