@@ -8,7 +8,7 @@ module Json.Encode
8 , Value(..)
8 , Value(..)
@@ -25,15 +25,11 @@ import Prelude hiding (null)
25import Control.Arrow ((***))
25import Control.Arrow ((***))
26import qualified Data.ByteString.Char8 as BSC
26import qualified Data.ByteString.Char8 as BSC
27import qualified Data.ByteString.Builder as B
27import qualified Data.ByteString.Builder as B
28−import qualified Data.ByteString.Builder.Prim as BP
29−import Data.ByteString.Builder.Prim ((>*<))
30import qualified Data.Map as Map
28import qualified Data.Map as Map
31import qualified Data.Scientific as Sci
29import qualified Data.Scientific as Sci
32import Data.Monoid ((<>))
30import Data.Monoid ((<>))
33import qualified Data.Name as Name
31import qualified Data.Name as Name
34−import qualified Data.Text as Text
32+import qualified Data.Utf8 as Utf8
35−import qualified Data.Text.Encoding as Text
36−import qualified Data.Word as W
37import System.IO (IOMode(WriteMode), withBinaryFile)
33import System.IO (IOMode(WriteMode), withBinaryFile)
@@ -43,7 +39,7 @@ import System.IO (IOMode(WriteMode), withBinaryFile)
45 = Array [Value]
41 = Array [Value]
46− | Object [(Text.Text, Value)]
42+ | Object [(Utf8.String, Value)]
47 | String B.Builder
43 | String B.Builder
48 | Boolean Bool
44 | Boolean Bool
49 | Integer Int
45 | Integer Int
@@ -56,19 +52,19 @@ array =
59−object :: [(Text.Text,Value)] -> Value
55+object :: [(Utf8.String,Value)] -> Value
64−text :: Text.Text -> Value
60+string :: Utf8.String -> Value
65−text txt =
61+string str =
66− String (encodeText txt)
62+ String (encodeUtf8 str)
69name :: Name.Name -> Value
65name :: Name.Name -> Value
71− String ("\"" <> Name.toBuilder nm <> "\"")
67+ String (B.char7 '"' <> Name.toBuilder nm <> B.char7 '"')
74bool :: Bool -> Value
70bool :: Bool -> Value
@@ -91,7 +87,7 @@ null =
94−dict :: (k -> Text.Text) -> (v -> Value) -> Map.Map k v -> Value
90+dict :: (k -> Utf8.String) -> (v -> Value) -> Map.Map k v -> Value
95dict encodeKey encodeValue pairs =
91dict encodeKey encodeValue pairs =
96 Object $ map (encodeKey *** encodeValue) (Map.toList pairs)
92 Object $ map (encodeKey *** encodeValue) (Map.toList pairs)
@@ -149,7 +145,7 @@ encodeUgly value =
149 Object (first : rest) ->
145 Object (first : rest) ->
151 encodeEntry char (key, entry) =
147 encodeEntry char (key, entry) =
152− B.char7 char <> encodeText key <> B.char7 ':' <> encodeUgly entry
148+ B.char7 char <> encodeUtf8 key <> B.char7 ':' <> encodeUgly entry
154 encodeEntry '{' first <> mconcat (map (encodeEntry ',') rest) <> B.char7 '}'
150 encodeEntry '{' first <> mconcat (map (encodeEntry ',') rest) <> B.char7 '}'
@@ -210,6 +206,15 @@ encodeHelp indent value =
212+encodeUtf8 :: Utf8.String -> B.Builder
214+ B.char7 '"' <> Utf8.toBuilder str <> B.char7 '"'
213-- ENCODE ARRAY
218-- ENCODE ARRAY
@@ -232,7 +237,7 @@ arrayClose =
232-- ENCODE OBJECT
237-- ENCODE OBJECT
235−encodeObject :: BSC.ByteString -> (Text.Text, Value) -> [(Text.Text, Value)] -> B.Builder
240+encodeObject :: BSC.ByteString -> (Utf8.String, Value) -> [(Utf8.String, Value)] -> B.Builder
236encodeObject =
241encodeObject =
237 encodeSequence objectOpen objectClose encodeField
242 encodeSequence objectOpen objectClose encodeField
@@ -247,9 +252,9 @@ objectClose =
247 B.char7 '}'
252 B.char7 '}'
250−encodeField :: BSC.ByteString -> (Text.Text, Value) -> B.Builder
255+encodeField :: BSC.ByteString -> (Utf8.String, Value) -> B.Builder
251encodeField indent (key, value) =
256encodeField indent (key, value) =
252− encodeText key <> B.string7 ": " <> encodeHelp indent value
257+ encodeUtf8 key <> B.string7 ": " <> encodeHelp indent value
@@ -288,34 +293,3 @@ commaNewline =
288newline :: B.Builder
293newline :: B.Builder
290 B.char7 '\n'
295 B.char7 '\n'
297−encodeText :: Text.Text -> B.Builder
299− B.char7 '"' <> Text.encodeUtf8BuilderEscaped escapeAscii txt <> B.char7 '"'
302−{-# INLINE escapeAscii #-}
303−escapeAscii :: BP.BoundedPrim W.Word8
305− BP.condB (== 0x5C {- \\ -}) (ascii2 ('\\','\\')) $
306− BP.condB (== 0x22 {- \" -}) (ascii2 ('\\','"' )) $
307− BP.condB (>= 0x20 ) (BP.liftFixedToBounded BP.word8) $
308− BP.condB (== 0x0A {- \n -}) (ascii2 ('\\','n' )) $
309− BP.condB (== 0x0D {- \r -}) (ascii2 ('\\','r' )) $
310− BP.condB (== 0x09 {- \t -}) (ascii2 ('\\','t' )) $
311− BP.liftFixedToBounded hexEscape -- fallback for chars < 0x20
313− hexEscape :: BP.FixedPrim W.Word8
314− hexEscape = (\c -> ('\\', ('u', fromIntegral c))) BP.>$<
315− BP.char8 >*< BP.char8 >*< BP.word16HexFixed
318−{-# INLINE ascii2 #-}
319−ascii2 :: (Char, Char) -> BP.BoundedPrim a
321− BP.liftFixedToBounded $ const cs BP.>$< BP.char7 >*< BP.char7