diff options
author | Sam Truzjan <pxqr.sta@gmail.com> | 2013-09-28 03:11:19 +0400 |
---|---|---|
committer | Sam Truzjan <pxqr.sta@gmail.com> | 2013-09-28 03:11:19 +0400 |
commit | a872f567f2ff4dea61c0c2f51a8b75c4d4503fb7 (patch) | |
tree | 21e1fa02d3f5cf359e1bb45b5d4002229695a91e | |
parent | fd044dd8d567bb0b24b36dab58c7219bb0001aaa (diff) |
Added generic integral coders
-rw-r--r-- | src/Data/BEncode.hs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/Data/BEncode.hs b/src/Data/BEncode.hs index 9cbd1e5..a9f6aac 100644 --- a/src/Data/BEncode.hs +++ b/src/Data/BEncode.hs | |||
@@ -105,8 +105,9 @@ module Data.BEncode | |||
105 | import Control.Applicative | 105 | import Control.Applicative |
106 | import Control.DeepSeq | 106 | import Control.DeepSeq |
107 | import Control.Monad | 107 | import Control.Monad |
108 | import Data.Int | ||
108 | import Data.Maybe (mapMaybe) | 109 | import Data.Maybe (mapMaybe) |
109 | import Data.Monoid -- (mempty, (<>)) | 110 | import Data.Monoid |
110 | import Data.Foldable (foldMap) | 111 | import Data.Foldable (foldMap) |
111 | import Data.Traversable (traverse) | 112 | import Data.Traversable (traverse) |
112 | import Data.Word (Word8, Word16, Word32, Word64, Word) | 113 | import Data.Word (Word8, Word16, Word32, Word64, Word) |
@@ -125,6 +126,7 @@ import qualified Data.ByteString.Lazy.Builder.ASCII as B | |||
125 | import Data.ByteString.Internal as B (c2w, w2c) | 126 | import Data.ByteString.Internal as B (c2w, w2c) |
126 | import Data.Text (Text) | 127 | import Data.Text (Text) |
127 | import qualified Data.Text.Encoding as T | 128 | import qualified Data.Text.Encoding as T |
129 | import Data.Typeable | ||
128 | import Data.Version | 130 | import Data.Version |
129 | import Text.PrettyPrint hiding ((<>)) | 131 | import Text.PrettyPrint hiding ((<>)) |
130 | import qualified Text.ParserCombinators.ReadP as ReadP | 132 | import qualified Text.ParserCombinators.ReadP as ReadP |
@@ -384,6 +386,21 @@ instance BEncodable BDict where | |||
384 | -- Integral instances | 386 | -- Integral instances |
385 | --------------------------------------------------------------------} | 387 | --------------------------------------------------------------------} |
386 | 388 | ||
389 | {- NOTE: instance Integral a => BEncodable a | ||
390 | requires -XUndecidableInstances, so we avoid it | ||
391 | -} | ||
392 | |||
393 | toBEncodeIntegral :: Integral a => a -> BEncode | ||
394 | toBEncodeIntegral = BInteger . fromIntegral | ||
395 | {-# INLINE toBEncodeIntegral #-} | ||
396 | |||
397 | fromBEncodeIntegral :: forall a. Typeable a => Integral a => BEncode -> Result a | ||
398 | fromBEncodeIntegral (BInteger i) = pure (fromIntegral i) | ||
399 | fromBEncodeIntegral _ | ||
400 | = decodingError $ show $ typeOf (undefined :: a) | ||
401 | {-# INLINE fromBEncodeIntegral #-} | ||
402 | |||
403 | |||
387 | instance BEncodable Word8 where | 404 | instance BEncodable Word8 where |
388 | toBEncode = toBEncode . (fromIntegral :: Word8 -> Word64) | 405 | toBEncode = toBEncode . (fromIntegral :: Word8 -> Word64) |
389 | {-# INLINE toBEncode #-} | 406 | {-# INLINE toBEncode #-} |