@@ -15,6 +15,12 @@ module Data.Aeson.Encode.ByteString
16 , encodeToBuilder
16 , encodeToBuilder
17 , encodeToByteStringBuilder
17 , encodeToByteStringBuilder
20import Data.Aeson.Types (ToJSON(..), Value(..))
26import Data.Aeson.Types (ToJSON(..), Value(..))
@@ -41,7 +47,7 @@ encodeToBuilder :: Value -> Builder
41encodeToBuilder Null = null_
47encodeToBuilder Null = null_
42encodeToBuilder (Bool b) = bool b
48encodeToBuilder (Bool b) = bool b
43encodeToBuilder (Number n) = number n
49encodeToBuilder (Number n) = number n
44−encodeToBuilder (String s) = string s
50+encodeToBuilder (String s) = text s
45encodeToBuilder (Array v) = array v
51encodeToBuilder (Array v) = array v
46encodeToBuilder (Object m) = object m
52encodeToBuilder (Object m) = object m
@@ -50,13 +56,16 @@ encodeToByteStringBuilder :: Value -> Builder
50encodeToByteStringBuilder = encodeToBuilder
56encodeToByteStringBuilder = encodeToBuilder
51{-# DEPRECATED encodeToByteStringBuilder "Use encodeToBuilder instead." #-}
57{-# DEPRECATED encodeToByteStringBuilder "Use encodeToBuilder instead." #-}
59+-- | Encode a JSON null.
53null_ :: Builder
60null_ :: Builder
54null_ = BP.primBounded (ascii4 ('n',('u',('l','l')))) ()
61null_ = BP.primBounded (ascii4 ('n',('u',('l','l')))) ()
63+-- | Encode a JSON boolean.
56bool :: Bool -> Builder
64bool :: Bool -> Builder
57bool = BP.primBounded (BP.condB id (ascii4 ('t',('r',('u','e'))))
65bool = BP.primBounded (BP.condB id (ascii4 ('t',('r',('u','e'))))
58 (ascii5 ('f',('a',('l',('s','e'))))))
66 (ascii5 ('f',('a',('l',('s','e'))))))
68+-- | Encode a JSON array.
60array :: V.Vector Value -> Builder
69array :: V.Vector Value -> Builder
62 | V.null v = B.char8 '[' <> B.char8 ']'
71 | V.null v = B.char8 '[' <> B.char8 ']'
@@ -66,16 +75,18 @@ array v
67 withComma a z = B.char8 ',' <> encodeToBuilder a <> z
76 withComma a z = B.char8 ',' <> encodeToBuilder a <> z
78+-- Encode a JSON object.
69object :: HMS.HashMap T.Text Value -> Builder
79object :: HMS.HashMap T.Text Value -> Builder
70object m = case HMS.toList m of
80object m = case HMS.toList m of
71 (x:xs) -> B.char8 '{' <> one x <> foldr withComma (B.char8 '}') xs
81 (x:xs) -> B.char8 '{' <> one x <> foldr withComma (B.char8 '}') xs
72 _ -> B.char8 '{' <> B.char8 '}'
82 _ -> B.char8 '{' <> B.char8 '}'
74 withComma a z = B.char8 ',' <> one a <> z
84 withComma a z = B.char8 ',' <> one a <> z
75− one (k,v) = string k <> B.char8 ':' <> encodeToBuilder v
85+ one (k,v) = text k <> B.char8 ':' <> encodeToBuilder v
87+-- | Encode a JSON string.
77−string :: T.Text -> B.Builder
88+text :: T.Text -> Builder
79 B.char8 '"' <> TE.encodeUtf8BuilderEscaped escapeAscii t <> B.char8 '"'
90 B.char8 '"' <> TE.encodeUtf8BuilderEscaped escapeAscii t <> B.char8 '"'
81 escapeAscii :: BP.BoundedPrim Word8
92 escapeAscii :: BP.BoundedPrim Word8
@@ -94,6 +105,7 @@ string t =
94 hexEscape = (\c -> ('\\', ('u', fromIntegral c))) BP.>$<
105 hexEscape = (\c -> ('\\', ('u', fromIntegral c))) BP.>$<
95 BP.char8 BP.>*< BP.char8 BP.>*< BP.word16HexFixed
106 BP.char8 BP.>*< BP.char8 BP.>*< BP.word16HexFixed
108+-- | Encode a JSON number.
97number :: Scientific -> Builder
109number :: Scientific -> Builder
99 | e < 0 = scientificBuilder s
111 | e < 0 = scientificBuilder s