diff options
Diffstat (limited to 'src/Data')
-rw-r--r-- | src/Data/BEncode/Internal.hs | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/Data/BEncode/Internal.hs b/src/Data/BEncode/Internal.hs index 4282cbf..e5ba89c 100644 --- a/src/Data/BEncode/Internal.hs +++ b/src/Data/BEncode/Internal.hs | |||
@@ -8,6 +8,7 @@ | |||
8 | -- This module provides bencode values serialization. Normally, you | 8 | -- This module provides bencode values serialization. Normally, you |
9 | -- don't need to import this module, use 'Data.BEncode' instead. | 9 | -- don't need to import this module, use 'Data.BEncode' instead. |
10 | -- | 10 | -- |
11 | {-# LANGUAGE MagicHash #-} | ||
11 | module Data.BEncode.Internal | 12 | module Data.BEncode.Internal |
12 | ( -- * Parsing | 13 | ( -- * Parsing |
13 | parser | 14 | parser |
@@ -23,10 +24,10 @@ import Control.Applicative | |||
23 | import Data.Attoparsec.ByteString.Char8 (Parser) | 24 | import Data.Attoparsec.ByteString.Char8 (Parser) |
24 | import qualified Data.Attoparsec.ByteString.Char8 as P | 25 | import qualified Data.Attoparsec.ByteString.Char8 as P |
25 | import Data.ByteString as B | 26 | import Data.ByteString as B |
27 | import Data.ByteString.Internal as B (c2w, w2c) | ||
26 | import qualified Data.ByteString.Lazy as Lazy | 28 | import qualified Data.ByteString.Lazy as Lazy |
27 | import qualified Data.ByteString.Lazy.Builder as B | 29 | import qualified Data.ByteString.Lazy.Builder as B |
28 | import qualified Data.ByteString.Lazy.Builder.ASCII as B | 30 | import qualified Data.ByteString.Lazy.Builder.ASCII as B |
29 | import Data.ByteString.Internal as B (c2w, w2c) | ||
30 | import Data.Foldable | 31 | import Data.Foldable |
31 | import Data.List as L | 32 | import Data.List as L |
32 | import Data.Monoid | 33 | import Data.Monoid |
@@ -35,17 +36,23 @@ import Text.PrettyPrint hiding ((<>)) | |||
35 | import Data.BEncode.Types | 36 | import Data.BEncode.Types |
36 | import Data.BEncode.BDict as BD | 37 | import Data.BEncode.BDict as BD |
37 | 38 | ||
39 | import GHC.Types | ||
40 | import GHC.Integer.GMP.Internals | ||
38 | 41 | ||
39 | {-------------------------------------------------------------------- | 42 | {-------------------------------------------------------------------- |
40 | -- Serialization | 43 | -- Serialization |
41 | --------------------------------------------------------------------} | 44 | --------------------------------------------------------------------} |
42 | 45 | ||
46 | integerDecimal :: Integer -> B.Builder | ||
47 | integerDecimal (S# i#) = B.intDec (I# i#) | ||
48 | integerDecimal i = B.string7 (show i) -- TODO more efficient | ||
49 | |||
43 | -- | BEncode format encoder according to specification. | 50 | -- | BEncode format encoder according to specification. |
44 | builder :: BValue -> B.Builder | 51 | builder :: BValue -> B.Builder |
45 | builder = go | 52 | builder = go |
46 | where | 53 | where |
47 | go (BInteger i) = B.word8 (c2w 'i') <> | 54 | go (BInteger i) = B.word8 (c2w 'i') <> |
48 | B.integerDec i <> | 55 | integerDecimal i <> |
49 | B.word8 (c2w 'e') | 56 | B.word8 (c2w 'e') |
50 | go (BString s) = buildString s | 57 | go (BString s) = buildString s |
51 | go (BList l) = B.word8 (c2w 'l') <> | 58 | go (BList l) = B.word8 (c2w 'l') <> |