on master help sign in
Simplify the internal representation of JSON
70a4764Evan Czaplicki
builder/src/Deps/Website.hs+2−3
@@ -22,7 +22,6 @@ import qualified Data.Binary.Get as Binary
22import qualified Data.ByteString.Char8 as BS
22import qualified Data.ByteString.Char8 as BS
23import qualified Data.ByteString.Lazy as LBS
23import qualified Data.ByteString.Lazy as LBS
24import qualified Data.Digest.Pure.SHA as SHA
24import qualified Data.Digest.Pure.SHA as SHA
25−import qualified Data.HashMap.Lazy as HashMap
26import qualified Data.Map as Map
25import qualified Data.Map as Map
27import qualified Data.Text as Text
26import qualified Data.Text as Text
28import qualified Network.HTTP.Client as Client
27import qualified Network.HTTP.Client as Client
@@ -114,8 +113,8 @@ allPkgsDecoder =
114 Right pkg ->
113 Right pkg ->
115 checkKeys rest (Map.insert pkg versions pkgs)
114 checkKeys rest (Map.insert pkg versions pkgs)
116 in
115 in
117− do dict <- D.dict (D.list (D.mapError E.BadAllVsn Pkg.versionDecoder))
116+ do pairs <- D.pairs (D.list (D.mapError E.BadAllVsn Pkg.versionDecoder))
118− checkKeys (HashMap.toList dict) Map.empty
117+ checkKeys pairs Map.empty
119
118
120
119
121
120
compiler/src/Elm/Docs.hs+1−3
@@ -175,9 +175,7 @@ encodeCase ( tag, args ) =
175
175
176caseDecoder :: D.Decoder Error ( N.Name, [Type.Type] )
176caseDecoder :: D.Decoder Error ( N.Name, [Type.Type] )
177caseDecoder =
177caseDecoder =
178− (,)
179− <$> D.index 0 D.name
180− <*> D.index 1 (D.list typeDecoder)
178+ D.pair D.name (D.list typeDecoder)
181
179
182
180
183
181
compiler/src/Json/Decode.hs+5−8
@@ -7,7 +7,7 @@ module Json.Decode
7 , Json.string, Json.text, Json.name, Json.bool, Json.int
7 , Json.string, Json.text, Json.name, Json.bool, Json.int
8 , Json.list, Json.dict, Json.pairs, Json.maybe
8 , Json.list, Json.dict, Json.pairs, Json.maybe
9 , Json.field, Json.at
9 , Json.field, Json.at
10− , Json.index
10+ , Json.pair
11 , Json.map, Json.map2, Json.mapError
11 , Json.map, Json.map2, Json.mapError
12 , Json.succeed, Json.fail
12 , Json.succeed, Json.fail
13 , Json.andThen, Json.oneOf
13 , Json.andThen, Json.oneOf
@@ -18,10 +18,8 @@ module Json.Decode
18import Prelude hiding (length)
18import Prelude hiding (length)
19import qualified Data.ByteString.Char8 as Char8
19import qualified Data.ByteString.Char8 as Char8
20import qualified Data.ByteString.Internal as B
20import qualified Data.ByteString.Internal as B
21−import qualified Data.HashMap.Strict as HashMap
22import qualified Data.Text as Text
21import qualified Data.Text as Text
23import qualified Data.Text.Encoding as Text
22import qualified Data.Text.Encoding as Text
24−import qualified Data.Vector as Vector
25import Foreign.ForeignPtr (ForeignPtr)
23import Foreign.ForeignPtr (ForeignPtr)
26import GHC.Word (Word8(..))
24import GHC.Word (Word8(..))
27
25
@@ -106,7 +104,7 @@ object start =
106 spaces
104 spaces
107 objectHelp [entry]
105 objectHelp [entry]
108 , do Symbol.rightCurly
106 , do Symbol.rightCurly
109− return (Json.Object [] HashMap.empty)
107+ return (Json.Object [])
110 ]
108 ]
111
109
112
110
@@ -121,7 +119,7 @@ objectHelp revEntries =
121 objectHelp (entry:revEntries)
119 objectHelp (entry:revEntries)
122 ,
120 ,
123 do Symbol.rightCurly
121 do Symbol.rightCurly
124− return (Json.Object (reverse revEntries) (HashMap.fromList revEntries))
122+ return (Json.Object (reverse revEntries))
125 ]
123 ]
126
124
127
125
@@ -149,7 +147,7 @@ array start =
149 spaces
147 spaces
150 arrayHelp 1 [entry]
148 arrayHelp 1 [entry]
151 , do Symbol.rightSquare
149 , do Symbol.rightSquare
152− return (Json.Array Vector.empty)
150+ return (Json.Array [])
153 ]
151 ]
154
152
155
153
@@ -164,8 +162,7 @@ arrayHelp !length revEntries =
164 arrayHelp (length + 1) (entry:revEntries)
162 arrayHelp (length + 1) (entry:revEntries)
165 ,
163 ,
166 do Symbol.rightSquare
164 do Symbol.rightSquare
167− return $ Json.Array $ Vector.reverse $
165+ return $ Json.Array $ reverse revEntries
168− Vector.fromListN length revEntries
169 ]
166 ]
170
167
171
168
compiler/src/Json/Decode/Error.hs+3−4
@@ -139,10 +139,9 @@ anExpectedThing tipe =
139 Json.TBool -> ["a", D.green "BOOLEAN" <> "."]
139 Json.TBool -> ["a", D.green "BOOLEAN" <> "."]
140 Json.TInt -> ["an", D.green "INT" <> "."]
140 Json.TInt -> ["an", D.green "INT" <> "."]
141 Json.TObjectWith field -> ["an",D.green "OBJECT","with","a",D.green ("\"" <> D.fromString (Text.unpack field) <> "\""),"field."]
141 Json.TObjectWith field -> ["an",D.green "OBJECT","with","a",D.green ("\"" <> D.fromString (Text.unpack field) <> "\""),"field."]
142− Json.TArrayWith i len ->
142+ Json.TArrayPair len ->
143− ["a",D.green "longer",D.green "ARRAY" <> "."
143+ ["an",D.green "ARRAY","with",D.green "TWO","entries."
144− ,"I","need","index",D.fromInt i <> ",","but","this","array"
145− ,"only","has",D.fromInt len,"elements."
144+ ,"This","array","has",D.fromInt len, if len == 1 then "element." else "elements."
146 ]
145 ]
147
146
148
147
compiler/src/Json/Decode/Internals.hs+33−34
@@ -9,7 +9,7 @@ module Json.Decode.Internals
9 , list, dict, pairs
9 , list, dict, pairs
10 , maybe
10 , maybe
11 , field, at
11 , field, at
12− , index
12+ , pair
13 , map, map2, mapError
13 , map, map2, mapError
14 , succeed, fail
14 , succeed, fail
15 , andThen, oneOf
15 , andThen, oneOf
@@ -20,11 +20,10 @@ module Json.Decode.Internals
20import Data.Text (Text)
20import Data.Text (Text)
21import Prelude hiding (fail, map, maybe)
21import Prelude hiding (fail, map, maybe)
22
22
23−import qualified Data.HashMap.Strict as HashMap
23+import qualified Data.List as List
24+import qualified Data.Map.Strict as Map
24import qualified Data.Scientific as Sci
25import qualified Data.Scientific as Sci
25import qualified Data.Text as Text
26import qualified Data.Text as Text
26−import qualified Data.Vector as Vector
27−import Data.Vector ((!?))
28import qualified Elm.Name as N
27import qualified Elm.Name as N
29import qualified Json.Encode as E
28import qualified Json.Encode as E
30
29
@@ -34,8 +33,8 @@ import qualified Json.Encode as E
34
33
35
34
36data Value
35data Value
37− = Array (Vector.Vector Value)
36+ = Array [Value]
38− | Object [(Text, Value)] (HashMap.HashMap Text Value)
37+ | Object [(Text, Value)]
39 | String Text
38 | String Text
40 | Integer Int
39 | Integer Int
41 | Float Sci.Scientific
40 | Float Sci.Scientific
@@ -71,7 +70,7 @@ data Type
71 | TBool
70 | TBool
72 | TInt
71 | TInt
73 | TObjectWith Text
72 | TObjectWith Text
74− | TArrayWith Int Int
73+ | TArrayPair Int
75
74
76
75
77
76
@@ -132,27 +131,27 @@ list :: Decoder e a -> Decoder e [a]
132list (Decoder run) =
131list (Decoder run) =
133 Decoder $ \value ->
132 Decoder $ \value ->
134 case value of
133 case value of
135− Array vector ->
134+ Array vs ->
136 let
135 let
137 runHelp i v =
136 runHelp i v =
138 mapLeft (Index i) (run v)
137 mapLeft (Index i) (run v)
139 in
138 in
140− Vector.toList <$> Vector.imapM runHelp vector
139+ sequenceA (zipWith runHelp [0..] vs)
141
140
142 _ ->
141 _ ->
143 Left (expecting value TArray)
142 Left (expecting value TArray)
144
143
145
144
146−dict :: Decoder e a -> Decoder e (HashMap.HashMap Text a)
145+dict :: Decoder e a -> Decoder e (Map.Map Text a)
147dict (Decoder run) =
146dict (Decoder run) =
148 Decoder $ \value ->
147 Decoder $ \value ->
149 case value of
148 case value of
150− Object _ hashMap ->
149+ Object kvs ->
151 let
150 let
152 runHelp k v =
151 runHelp k v =
153 mapLeft (Field k) (run v)
152 mapLeft (Field k) (run v)
154 in
153 in
155− HashMap.traverseWithKey runHelp hashMap
154+ Map.traverseWithKey runHelp (Map.fromList kvs)
156
155
157 _ ->
156 _ ->
158 Left (expecting value TObject)
157 Left (expecting value TObject)
@@ -162,7 +161,7 @@ pairs :: Decoder e a -> Decoder e [(Text, a)]
162pairs (Decoder run) =
161pairs (Decoder run) =
163 Decoder $ \value ->
162 Decoder $ \value ->
164 case value of
163 case value of
165− Object kvs _ ->
164+ Object kvs ->
166 let
165 let
167 runHelp (k,v) =
166 runHelp (k,v) =
168 case run v of
167 case run v of
@@ -194,8 +193,8 @@ field :: Text -> Decoder e a -> Decoder e a
194field k (Decoder run) =
193field k (Decoder run) =
195 Decoder $ \value ->
194 Decoder $ \value ->
196 case value of
195 case value of
197− Object _ hashMap ->
196+ Object kvs ->
198− case HashMap.lookup k hashMap of
197+ case List.lookup k kvs of
199 Just v ->
198 Just v ->
200 mapLeft (Field k) (run v)
199 mapLeft (Field k) (run v)
201
200
@@ -215,17 +214,19 @@ at names decoder =
215-- ARRAY PRIMITIVES
214-- ARRAY PRIMITIVES
216
215
217
216
218−index :: Int -> Decoder e a -> Decoder e a
217+pair :: Decoder e a -> Decoder e b -> Decoder e (a,b)
219−index i (Decoder run) =
218+pair (Decoder runA) (Decoder runB) =
220 Decoder $ \value ->
219 Decoder $ \value ->
221 case value of
220 case value of
222− Array vector ->
221+ Array vs ->
223− case vector !? i of
222+ case vs of
224− Just v ->
223+ [a,b] ->
224+ (,)
225+ <$> mapLeft (Index 0) (runA a)
225− mapLeft (Index i) (run v)
226+ <*> mapLeft (Index 1) (runB b)
226
227
227− Nothing ->
228+ _ ->
228− Left (expecting value (TArrayWith i (Vector.length vector)))
229+ Left (expecting value (TArrayPair (length vs)))
229
230
230 _ ->
231 _ ->
231 Left (expecting value TArray)
232 Left (expecting value TArray)
@@ -266,14 +267,14 @@ expecting value tipe =
266toEncodeValue :: Value -> E.Value
267toEncodeValue :: Value -> E.Value
267toEncodeValue value =
268toEncodeValue value =
268 case value of
269 case value of
269− Array vector -> E.array (Vector.toList (Vector.map toEncodeValue vector))
270+ Array vs -> E.array (fmap toEncodeValue vs)
270− Object fields _ -> E.object (fmap (fmap toEncodeValue) fields)
271+ Object kvs -> E.object (fmap (fmap toEncodeValue) kvs)
271− String txt -> E.text txt
272+ String txt -> E.text txt
272− Integer n -> E.int n
273+ Integer n -> E.int n
273− Float n -> E.number n
274+ Float n -> E.number n
274− TRUE -> E.bool True
275+ TRUE -> E.bool True
275− FALSE -> E.bool False
276+ FALSE -> E.bool False
276− NULL -> E.null
277+ NULL -> E.null
277
278
278
279
279
280
@@ -297,9 +298,7 @@ map2 func (Decoder runA) (Decoder runB) =
297apply :: Decoder e (a -> b) -> Decoder e a -> Decoder e b
298apply :: Decoder e (a -> b) -> Decoder e a -> Decoder e b
298apply (Decoder runFunc) (Decoder runArg) =
299apply (Decoder runFunc) (Decoder runArg) =
299 Decoder $ \value ->
300 Decoder $ \value ->
300− do func <- runFunc value
301− arg <- runArg value
301+ runFunc value <*> runArg value
302− return (func arg)
303
302
304
303
305
304