summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Truzjan <pxqr.sta@gmail.com>2013-09-28 03:11:19 +0400
committerSam Truzjan <pxqr.sta@gmail.com>2013-09-28 03:11:19 +0400
commita872f567f2ff4dea61c0c2f51a8b75c4d4503fb7 (patch)
tree21e1fa02d3f5cf359e1bb45b5d4002229695a91e
parentfd044dd8d567bb0b24b36dab58c7219bb0001aaa (diff)
Added generic integral coders
-rw-r--r--src/Data/BEncode.hs19
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
105import Control.Applicative 105import Control.Applicative
106import Control.DeepSeq 106import Control.DeepSeq
107import Control.Monad 107import Control.Monad
108import Data.Int
108import Data.Maybe (mapMaybe) 109import Data.Maybe (mapMaybe)
109import Data.Monoid -- (mempty, (<>)) 110import Data.Monoid
110import Data.Foldable (foldMap) 111import Data.Foldable (foldMap)
111import Data.Traversable (traverse) 112import Data.Traversable (traverse)
112import Data.Word (Word8, Word16, Word32, Word64, Word) 113import Data.Word (Word8, Word16, Word32, Word64, Word)
@@ -125,6 +126,7 @@ import qualified Data.ByteString.Lazy.Builder.ASCII as B
125import Data.ByteString.Internal as B (c2w, w2c) 126import Data.ByteString.Internal as B (c2w, w2c)
126import Data.Text (Text) 127import Data.Text (Text)
127import qualified Data.Text.Encoding as T 128import qualified Data.Text.Encoding as T
129import Data.Typeable
128import Data.Version 130import Data.Version
129import Text.PrettyPrint hiding ((<>)) 131import Text.PrettyPrint hiding ((<>))
130import qualified Text.ParserCombinators.ReadP as ReadP 132import 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
393toBEncodeIntegral :: Integral a => a -> BEncode
394toBEncodeIntegral = BInteger . fromIntegral
395{-# INLINE toBEncodeIntegral #-}
396
397fromBEncodeIntegral :: forall a. Typeable a => Integral a => BEncode -> Result a
398fromBEncodeIntegral (BInteger i) = pure (fromIntegral i)
399fromBEncodeIntegral _
400 = decodingError $ show $ typeOf (undefined :: a)
401{-# INLINE fromBEncodeIntegral #-}
402
403
387instance BEncodable Word8 where 404instance BEncodable Word8 where
388 toBEncode = toBEncode . (fromIntegral :: Word8 -> Word64) 405 toBEncode = toBEncode . (fromIntegral :: Word8 -> Word64)
389 {-# INLINE toBEncode #-} 406 {-# INLINE toBEncode #-}