on master help sign in
Introduce "ugly" encoding
4cc8b09Evan Czaplicki
src/Json/Encode.hs+48
@@ -3,6 +3,8 @@
3module Json.Encode
3module Json.Encode
4 ( write
4 ( write
5 , encode
5 , encode
6+ , writeUgly
7+ , encodeUgly
6 , Value
8 , Value
7 , array
9 , array
8 , object
10 , object
@@ -106,6 +108,52 @@ write path value =
106 B.hPutBuilder handle (encode value)
108 B.hPutBuilder handle (encode value)
107
109
108
110
111+writeUgly :: FilePath -> Value -> IO ()
112+writeUgly path value =
113+ withBinaryFile path WriteMode $ \handle ->
114+ B.hPutBuilder handle (encodeUgly value)
115+
116+
117+
118+-- ENCODE UGLY
119+
120+
121+encodeUgly :: Value -> B.Builder
122+encodeUgly value =
123+ case value of
124+ Array [] ->
125+ B.string7 "[]"
126+
127+ Array (first : rest) ->
128+ let
129+ encodeEntry entry =
130+ B.char7 ',' <> encodeUgly entry
131+ in
132+ B.char7 '[' <> encodeUgly first <> mconcat (map encodeEntry rest) <> B.char7 ']'
133+
134+ Object [] ->
135+ B.string7 "{}"
136+
137+ Object (first : rest) ->
138+ let
139+ encodeEntry char (key, entry) =
140+ B.char7 char <> encodeString key <> B.char7 ':' <> encodeUgly entry
141+ in
142+ encodeEntry '[' first <> mconcat (map (encodeEntry ',') rest) <> B.char7 ']'
143+
144+ String builder ->
145+ builder
146+
147+ Boolean boolean ->
148+ B.string7 (if boolean then "true" else "false")
149+
150+ Integer n ->
151+ B.intDec n
152+
153+ Null ->
154+ "null"
155+
156+
109
157
110-- ENCODE
158-- ENCODE
111
159