@@ -17,7 +17,7 @@ module Data.Aeson.Encode.Number
1717import Data.Monoid (mappend, mempty)
1818import Data.Attoparsec.Number (Number(..))
1919import Blaze.ByteString.Builder
20−import GHC.Num (quotRemInt, quotRemInteger)
20+import GHC.Num (quotRemInteger)
2121import GHC.Types (Int(..))
2222import qualified Text.Show.ByteString as S
2323
@@ -29,6 +29,12 @@ import GHC.Integer.GMP.Internals
2929# endif
3030#endif
3131
32+#ifdef INTEGER_GMP
33+# define PAIR(a,b) (# a,b #)
34+#else
35+# define PAIR(a,b) (a,b)
36+#endif
37+
3238fromNumber :: Number -> Builder
3339fromNumber (I i) = integer i
3440fromNumber (D d) = fromLazyByteString (S.show d)
@@ -36,48 +42,35 @@ fromNumber (D d) = fromLazyByteString (S.show d)
3642integer :: Integer -> Builder
3743integer (S# i#) = int (I# i#)
3844integer i
39− | i < 0 = fromWord8 45 `mappend` go (-i)
45+ | i < 0 = minus `mappend` go (-i)
4046 | otherwise = go i
4147 where
4248 go n | n < maxInt = int (fromInteger n)
4349 | otherwise = putH (splitf (maxInt * maxInt) n)
4450
45− splitf :: Integer -> Integer -> [Integer]
4651 splitf p n
47− | p > n = [n]
48− | otherwise = splith p (splitf (p*p) n)
52+ | p > n = [n]
53+ | otherwise = splith p (splitf (p*p) n)
4954
50− splith :: Integer -> [Integer] -> [Integer]
51− splith _ [ ] = error "splith: the impossible happened."
5255 splith p (n:ns) = case n `quotRemInteger` p of
53−#ifdef INTEGER_GMP
54− (# q, r #) ->
55−#else
56− (q, r) ->
57−#endif
58− if q > 0
59− then q : r : splitb p ns
60− else r : splitb p ns
61− splitb :: Integer -> [Integer] -> [Integer]
62− splitb _ [ ] = []
56+ PAIR(q,r) | q > 0 -> q : r : splitb p ns
57+ | otherwise -> r : splitb p ns
58+ splith _ _ = error "splith: the impossible happened."
59+
6360 splitb p (n:ns) = case n `quotRemInteger` p of
64−#ifdef INTEGER_GMP
65− (# q, r #) ->
66−#else
67− (q, r) ->
68−#endif
69− q : r : splitb p ns
61+ PAIR(q,r) -> q : r : splitb p ns
62+ splitb _ _ = []
7063
7164int :: Int -> Builder
7265int i
73− | i < 0 = fromWord8 45 `mappend` go (-i)
66+ | i < 0 = minus `mappend` go (-i)
7467 | otherwise = go i
7568 where
7669 go n | n < 10 = digit n
7770 | otherwise = go (n `rem` 10) `mappend` digit (n `quot` 10)
7871
7972digit :: Int -> Builder
80−digit n = fromWord8 (fromIntegral n + 48)
73+digit n = fromWord8 $! fromIntegral n + 48
8174
8275data T = T !Integer !Int
8376
@@ -92,28 +85,18 @@ T maxInt maxDigits =
9285
9386putH :: [Integer] -> Builder
9487putH (n:ns) = case n `quotRemInteger` maxInt of
95−#ifdef INTEGER_GMP
96− (# q', r' #) ->
97−#else
98− (q', r') ->
99−#endif
100− let q = fromInteger q'
101− r = fromInteger r'
102− in if q > 0
103− then int q `mappend` pblock r `mappend` putB ns
104− else int r `mappend` putB ns
88+ PAIR(x,y)
89+ | q > 0 -> int q `mappend` pblock r `mappend` putB ns
90+ | otherwise -> int r `mappend` putB ns
91+ where q = fromInteger x
92+ r = fromInteger y
10593putH _ = error "putH: the impossible happened"
10694
10795putB :: [Integer] -> Builder
10896putB (n:ns) = case n `quotRemInteger` maxInt of
109−#ifdef INTEGER_GMP
110− (# q', r' #) ->
111−#else
112− (q', r') ->
113−#endif
114− let q = fromInteger q'
115− r = fromInteger r'
116− in pblock q `mappend` pblock r `mappend` putB ns
97+ PAIR(x,y) -> pblock q `mappend` pblock r `mappend` putB ns
98+ where q = fromInteger x
99+ r = fromInteger y
117100putB _ = mempty
118101
119102pblock :: Int -> Builder
@@ -122,4 +105,8 @@ pblock = go maxDigits
122105 go !d !n
123106 | d == 1 = digit n
124107 | otherwise = go (d-1) q `mappend` digit r
125− where (q, r) = n `quotRemInt` 10
108+ where q = n `quot` 10
109+ r = n `rem` 10
110+
111+minus :: Builder
112+minus = fromWord8 45