on master help sign in
backport the fix
commitfcb96174a9ec8637f7ce8c7484af29fdb8d9385c authorMatt Parsons <parsonsmatt@gmail.com> dateFri 20 Jan 2017, 16:45 (10 years ago) parent4ac6472
1 file changed+26−23
Data/Aeson/Encode/Builder.hs+26−23
Data/Aeson/Encode/Builder.hs+26−23
@@ -1,4 +1,5 @@
1−{-# LANGUAGE BangPatterns, OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE OverloadedStrings #-}
23
34-- |
45-- Module: Data.Aeson.Encode.Builder
@@ -35,22 +36,23 @@ module Data.Aeson.Encode.Builder
3536 , ascii5
3637 ) where
3738
38−import Data.Aeson.Internal.Time
39−import Data.Aeson.Types.Internal (Encoding(..), Value(..))
40−import Data.ByteString.Builder as B
41−import Data.ByteString.Builder.Prim as BP
42−import Data.ByteString.Builder.Scientific (scientificBuilder)
43−import Data.Char (chr, ord)
44−import Data.Monoid ((<>))
45−import Data.Scientific (Scientific, base10Exponent, coefficient)
46−import Data.Time (UTCTime(..))
47−import Data.Time.Calendar (Day(..), toGregorian)
48−import Data.Time.LocalTime
49−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
39+import Data.Aeson.Internal.Time
40+import Data.Aeson.Types.Internal (Encoding (..), Value (..))
41+import Data.ByteString.Builder as B
42+import Data.ByteString.Builder.Prim as BP
43+import Data.ByteString.Builder.Scientific (scientificBuilder)
44+import Data.Char (chr, ord)
45+import qualified Data.HashMap.Strict as HMS
46+import Data.Monoid ((<>))
47+import Data.Scientific (Scientific, base10Exponent,
48+ coefficient)
49+import qualified Data.Text as T
50+import qualified Data.Text.Encoding as TE
51+import Data.Time (UTCTime (..))
52+import Data.Time.Calendar (Day (..), toGregorian)
53+import Data.Time.LocalTime
54+import qualified Data.Vector as V
55+import Data.Word (Word8)
5456
5557-- | Encode a JSON value to a "Data.ByteString" 'B.Builder'.
5658--
@@ -181,12 +183,13 @@ day dd = encodeYear yr <>
181183 !(T dh dl) = twoDigits d
182184 encodeYear y
183185 | y >= 1000 = B.integerDec y
184− | y > 0 =
185− let (ab,c) = fromIntegral y `quotRem` 10
186− (a,b) = ab `quotRem` 10
187− in BP.primBounded (ascii4 ('0',(digit a,(digit b,digit c)))) ()
188− | otherwise =
189− error "Data.Aeson.Encode.Builder.day: years BCE not supported"
186+ | y >= 0 = BP.primBounded (ascii4 (padYear y)) ()
187+ | y >= -999 = BP.primBounded (ascii5 ('-',padYear (- y))) ()
188+ | otherwise = B.integerDec y
189+ padYear y =
190+ let (ab,c) = fromIntegral y `quotRem` 10
191+ (a,b) = ab `quotRem` 10
192+ in ('0',(digit a,(digit b,digit c)))
190193{-# INLINE day #-}
191194
192195timeOfDay :: TimeOfDay -> Builder