on master help sign in
backport the fix
fcb9617Matt Parsons
Data/Aeson/Encode/Builder.hs+26−23
@@ -1,4 +1,5 @@
1−{-# LANGUAGE BangPatterns, OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE OverloadedStrings #-}
2
3
3-- |
4-- |
4-- Module: Data.Aeson.Encode.Builder
5-- Module: Data.Aeson.Encode.Builder
@@ -35,22 +36,23 @@ module Data.Aeson.Encode.Builder
35 , ascii5
36 , ascii5
36 ) where
37 ) where
37
38
38−import Data.Aeson.Internal.Time
39+import Data.Aeson.Internal.Time
39−import Data.Aeson.Types.Internal (Encoding(..), Value(..))
40+import Data.Aeson.Types.Internal (Encoding (..), Value (..))
40−import Data.ByteString.Builder as B
41+import Data.ByteString.Builder as B
41−import Data.ByteString.Builder.Prim as BP
42+import Data.ByteString.Builder.Prim as BP
42−import Data.ByteString.Builder.Scientific (scientificBuilder)
43+import Data.ByteString.Builder.Scientific (scientificBuilder)
43−import Data.Char (chr, ord)
44+import Data.Char (chr, ord)
45+import qualified Data.HashMap.Strict as HMS
44−import Data.Monoid ((<>))
46+import Data.Monoid ((<>))
45−import Data.Scientific (Scientific, base10Exponent, coefficient)
47+import Data.Scientific (Scientific, base10Exponent,
48+ coefficient)
49+import qualified Data.Text as T
50+import qualified Data.Text.Encoding as TE
46−import Data.Time (UTCTime(..))
51+import Data.Time (UTCTime (..))
47−import Data.Time.Calendar (Day(..), toGregorian)
52+import Data.Time.Calendar (Day (..), toGregorian)
48−import Data.Time.LocalTime
53+import Data.Time.LocalTime
54+import qualified Data.Vector as V
49−import Data.Word (Word8)
55+import Data.Word (Word8)
50−import qualified Data.HashMap.Strict as HMS
51−import qualified Data.Text as T
52−import qualified Data.Text.Encoding as TE
53−import qualified Data.Vector as V
54
56
55-- | Encode a JSON value to a "Data.ByteString" 'B.Builder'.
57-- | Encode a JSON value to a "Data.ByteString" 'B.Builder'.
56--
58--
@@ -181,12 +183,13 @@ day dd = encodeYear yr <>
181 !(T dh dl) = twoDigits d
183 !(T dh dl) = twoDigits d
182 encodeYear y
184 encodeYear y
183 | y >= 1000 = B.integerDec y
185 | y >= 1000 = B.integerDec y
184− | y > 0 =
186+ | y >= 0 = BP.primBounded (ascii4 (padYear y)) ()
187+ | y >= -999 = BP.primBounded (ascii5 ('-',padYear (- y))) ()
188+ | otherwise = B.integerDec y
189+ padYear y =
185− let (ab,c) = fromIntegral y `quotRem` 10
190+ let (ab,c) = fromIntegral y `quotRem` 10
186− (a,b) = ab `quotRem` 10
191+ (a,b) = ab `quotRem` 10
187− in BP.primBounded (ascii4 ('0',(digit a,(digit b,digit c)))) ()
192+ in ('0',(digit a,(digit b,digit c)))
188− | otherwise =
189− error "Data.Aeson.Encode.Builder.day: years BCE not supported"
190{-# INLINE day #-}
193{-# INLINE day #-}
191
194
192timeOfDay :: TimeOfDay -> Builder
195timeOfDay :: TimeOfDay -> Builder