From 2483bec57a19a9f60b84413ba2a9c9953aab9817 Mon Sep 17 00:00:00 2001 From: Sam T Date: Sun, 12 May 2013 05:22:46 +0400 Subject: + Add instance for tuples. --- src/Data/BEncode.hs | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'src') diff --git a/src/Data/BEncode.hs b/src/Data/BEncode.hs index e3ae292..9b72604 100644 --- a/src/Data/BEncode.hs +++ b/src/Data/BEncode.hs @@ -179,6 +179,7 @@ instance BEncodable a => BEncodable [a] where fromBEncode _ = decodingError "list" {-# INLINE fromBEncode #-} + instance BEncodable a => BEncodable (Map ByteString a) where {-# SPECIALIZE instance BEncodable (Map ByteString BEncode) #-} @@ -189,6 +190,68 @@ instance BEncodable a => BEncodable (Map ByteString a) where fromBEncode _ = decodingError "dictionary" {-# INLINE fromBEncode #-} +instance BEncodable () where + {-# SPECIALIZE instance BEncodable () #-} + toBEncode () = BList [] + {-# INLINE toBEncode #-} + + fromBEncode (BList []) = Right () + fromBEncode _ = decodingError "Unable to decode unit value" + {-# INLINE fromBEncode #-} + +instance (BEncodable a, BEncodable b) => BEncodable (a, b) where + {-# SPECIALIZE instance (BEncodable a, BEncodable b) => BEncodable (a, b) #-} + toBEncode (a, b) = BList [toBEncode a, toBEncode b] + {-# INLINE toBEncode #-} + + fromBEncode (BList [a, b]) = (,) <$> fromBEncode a <*> fromBEncode b + fromBEncode _ = decodingError "Unable to decode a pair." + {-# INLINE fromBEncode #-} + +instance (BEncodable a, BEncodable b, BEncodable c) => BEncodable (a, b, c) where + {-# SPECIALIZE instance (BEncodable a, BEncodable b, BEncodable c) + => BEncodable (a, b, c) #-} + {-# INLINE toBEncode #-} + toBEncode (a, b, c) = BList [toBEncode a, toBEncode b, toBEncode c] + + fromBEncode (BList [a, b, c]) = + (,,) <$> fromBEncode a <*> fromBEncode b <*> fromBEncode c + fromBEncode _ = decodingError "Unable to decode a triple" + {-# INLINE fromBEncode #-} + +instance (BEncodable a, BEncodable b, BEncodable c, BEncodable d) + => BEncodable (a, b, c, d) where + {-# SPECIALIZE instance (BEncodable a, BEncodable b, BEncodable c, BEncodable d) + => BEncodable (a, b, c, d) #-} + {-# INLINE toBEncode #-} + toBEncode (a, b, c, d) = BList [ toBEncode a, toBEncode b + , toBEncode c, toBEncode d + ] + + fromBEncode (BList [a, b, c, d]) = + (,,,) <$> fromBEncode a <*> fromBEncode b + <*> fromBEncode c <*> fromBEncode d + fromBEncode _ = decodingError "Unable to decode a tuple4" + {-# INLINE fromBEncode #-} + +instance (BEncodable a, BEncodable b, BEncodable c, BEncodable d, BEncodable e) + => BEncodable (a, b, c, d, e) where + {-# SPECIALIZE instance ( BEncodable a, BEncodable b + , BEncodable c, BEncodable d + , BEncodable e) + => BEncodable (a, b, c, d, e) #-} + {-# INLINE toBEncode #-} + toBEncode (a, b, c, d, e) = BList [ toBEncode a, toBEncode b + , toBEncode c, toBEncode d + , toBEncode e + ] + + fromBEncode (BList [a, b, c, d, e]) = + (,,,,) <$> fromBEncode a <*> fromBEncode b + <*> fromBEncode c <*> fromBEncode d <*> fromBEncode e + fromBEncode _ = decodingError "Unable to decode a tuple5" + {-# INLINE fromBEncode #-} + dictAssoc :: [(ByteString, BEncode)] -> BEncode dictAssoc = BDict . M.fromList {-# INLINE dictAssoc #-} -- cgit v1.2.3