@@ -10,6 +10,7 @@ module Json.Encode
1010 , object
1111 , string
1212 , name
13+ , chars
1314 , bool
1415 , int
1516 , number
@@ -32,6 +33,7 @@ import qualified Data.Name as Name
3233import qualified Data.Utf8 as Utf8
3334
3435import qualified File
36+import qualified Json.String as Json
3537
3638
3739
@@ -40,7 +42,7 @@ import qualified File
4042
4143data Value
4244 = Array [Value]
43− | Object [(Utf8.String, Value)]
45+ | Object [(Json.String, Value)]
4446 | String B.Builder
4547 | Boolean Bool
4648 | Integer Int
@@ -53,14 +55,14 @@ array =
5355 Array
5456
5557
56−object :: [(Utf8.String,Value)] -> Value
58+object :: [(Json.String, Value)] -> Value
5759object =
5860 Object
5961
6062
61−string :: Utf8.String -> Value
63+string :: Json.String -> Value
6264string str =
63− String (encodeUtf8 str)
65+ String (B.char7 '"' <> Json.toBuilder str <> B.char7 '"')
6466
6567
6668name :: Name.Name -> Value
@@ -68,6 +70,11 @@ name nm =
6870 String (B.char7 '"' <> Name.toBuilder nm <> B.char7 '"')
6971
7072
73+chars :: [Char] -> Value
74+chars chrs =
75+ String (B.char7 '"' <> error "TODO escape this properly. Who is using this?" chrs <> B.char7 '"')
76+
77+
7178bool :: Bool -> Value
7279bool =
7380 Boolean
@@ -88,7 +95,7 @@ null =
8895 Null
8996
9097
91−dict :: (k -> Utf8.String) -> (v -> Value) -> Map.Map k v -> Value
98+dict :: (k -> Json.String) -> (v -> Value) -> Map.Map k v -> Value
9299dict encodeKey encodeValue pairs =
93100 Object $ map (encodeKey *** encodeValue) (Map.toList pairs)
94101
@@ -102,9 +109,9 @@ list encodeEntry entries =
102109-- HELPERS
103110
104111
105−(==>) :: a -> b -> (a, b)
106−(==>) a b =
107− (a, b)
112+(==>) :: [Char] -> value -> (Json.String, value)
113+(==>) key value =
114+ (Json.fromChars key, value)
108115
109116
110117
@@ -144,7 +151,7 @@ encodeUgly value =
144151 Object (first : rest) ->
145152 let
146153 encodeEntry char (key, entry) =
147− B.char7 char <> encodeUtf8 key <> B.char7 ':' <> encodeUgly entry
154+ B.char7 char <> B.char7 '"' <> Utf8.toBuilder key <> B.string7 "\":" <> encodeUgly entry
148155 in
149156 encodeEntry '{' first <> mconcat (map (encodeEntry ',') rest) <> B.char7 '}'
150157
@@ -205,15 +212,6 @@ encodeHelp indent value =
205212
206213
207214
208−-- ENCODE UTF-8
209−
210−
211−encodeUtf8 :: Utf8.String -> B.Builder
212−encodeUtf8 str =
213− B.char7 '"' <> Utf8.toBuilder str <> B.char7 '"'
214−
215−
216−
217215-- ENCODE ARRAY
218216
219217
@@ -236,7 +234,7 @@ arrayClose =
236234-- ENCODE OBJECT
237235
238236
239−encodeObject :: BSC.ByteString -> (Utf8.String, Value) -> [(Utf8.String, Value)] -> B.Builder
237+encodeObject :: BSC.ByteString -> (Json.String, Value) -> [(Json.String, Value)] -> B.Builder
240238encodeObject =
241239 encodeSequence objectOpen objectClose encodeField
242240
@@ -251,9 +249,9 @@ objectClose =
251249 B.char7 '}'
252250
253251
254−encodeField :: BSC.ByteString -> (Utf8.String, Value) -> B.Builder
252+encodeField :: BSC.ByteString -> (Json.String, Value) -> B.Builder
255253encodeField indent (key, value) =
256− encodeUtf8 key <> B.string7 ": " <> encodeHelp indent value
254+ B.char7 '"' <> Utf8.toBuilder key <> B.string7 "\": " <> encodeHelp indent value
257255
258256
259257