@@ -54,12 +54,7 @@ decimal :: Integral a => a -> Builder
54{-# RULES "decimal/Word32" decimal = positive :: Word32 -> Builder #-}
54{-# RULES "decimal/Word32" decimal = positive :: Word32 -> Builder #-}
55{-# RULES "decimal/Word64" decimal = positive :: Word64 -> Builder #-}
55{-# RULES "decimal/Word64" decimal = positive :: Word64 -> Builder #-}
56{-# RULES "decimal/Integer" decimal = integer 10 :: Integer -> Builder #-}
56{-# RULES "decimal/Integer" decimal = integer 10 :: Integer -> Builder #-}
57−decimal i
57+decimal i = decimal' (<= -128) i
58− | i < 0 = singleton '-' <>
60− then positive (-(i `quot` 10)) <> digit (-(i `rem` 10))
62− | otherwise = positive i
64boundedDecimal :: (Integral a, Bounded a) => a -> Builder
59boundedDecimal :: (Integral a, Bounded a) => a -> Builder
65{-# SPECIALIZE boundedDecimal :: Int -> Builder #-}
60{-# SPECIALIZE boundedDecimal :: Int -> Builder #-}
@@ -67,11 +62,15 @@ boundedDecimal :: (Integral a, Bounded a) => a -> Builder
67{-# SPECIALIZE boundedDecimal :: Int16 -> Builder #-}
62{-# SPECIALIZE boundedDecimal :: Int16 -> Builder #-}
68{-# SPECIALIZE boundedDecimal :: Int32 -> Builder #-}
63{-# SPECIALIZE boundedDecimal :: Int32 -> Builder #-}
69{-# SPECIALIZE boundedDecimal :: Int64 -> Builder #-}
64{-# SPECIALIZE boundedDecimal :: Int64 -> Builder #-}
70−boundedDecimal i
65+boundedDecimal i = decimal' (== minBound) i
67+decimal' :: (Integral a) => (a -> Bool) -> a -> Builder
68+{-# INLINE decimal' #-}
71− | i < 0 = singleton '-' <>
70+ | i < 0 = singleton '-' <>
72− if i == minBound
71+ if p i
73− then positive (-(i `quot` 10)) <> digit (-(i `rem` 10))
72+ then positive (-(i `quot` 10)) <> digit (-(i `rem` 10))
74− else positive (-i)
73+ else positive (-i)
75 | otherwise = positive i
74 | otherwise = positive i
77positive :: (Integral a) => a -> Builder
76positive :: (Integral a) => a -> Builder