@@ -7,14 +7,13 @@ import Data.Argonaut.Decode (class DecodeJson, decodeJson)
7
7
import Data.Argonaut.Encode (class EncodeJson , encodeJson )
8
8
import Data.Array as A
9
9
import Data.Either (Either (..))
10
- import Data.Unfoldable (replicate )
11
10
import Data.Foldable (foldl )
12
11
import Data.Int as I
13
12
import Data.List (List (), zipWith , range , head , singleton , fromFoldable )
14
13
import Data.Maybe (Maybe (..), fromMaybe , maybe )
15
- import Data.Monoid (class Monoid )
16
- import Data.StrMap as M
17
14
import Data.Tuple (Tuple (..), fst , snd )
15
+ import Data.Unfoldable (replicate )
16
+ import Foreign.Object as FO
18
17
19
18
data JCursor
20
19
= JCursorTop
@@ -49,28 +48,41 @@ instance encodeJsonJCursor :: EncodeJson JCursor where
49
48
loop (JField i c) = [encodeJson i] <> loop c
50
49
loop (JIndex i c) = [encodeJson i] <> loop c
51
50
52
- newtype JsonPrim = JsonPrim (forall a . (J.JNull -> a ) -> (J.JBoolean -> a ) -> (J.JNumber -> a ) -> (J.JString -> a ) -> a )
53
-
54
- runJsonPrim :: JsonPrim -> (forall a . (J.JNull -> a ) -> (J.JBoolean -> a ) -> (J.JNumber -> a ) -> (J.JString -> a ) -> a )
51
+ newtype JsonPrim = JsonPrim
52
+ ( forall a
53
+ . (Unit -> a )
54
+ -> (Boolean -> a )
55
+ -> (Number -> a )
56
+ -> (String -> a )
57
+ -> a )
58
+
59
+ runJsonPrim
60
+ :: JsonPrim
61
+ -> ( forall a
62
+ . (Unit -> a )
63
+ -> (Boolean -> a )
64
+ -> (Number -> a )
65
+ -> (String -> a )
66
+ -> a )
55
67
runJsonPrim (JsonPrim p) = p
56
68
57
69
instance showJsonPrim :: Show JsonPrim where
58
70
show p = runJsonPrim p show show show show
59
71
60
72
primNull :: JsonPrim
61
- primNull = JsonPrim (\f _ _ _ -> f J .jNull )
73
+ primNull = JsonPrim (\f _ _ _ -> f unit )
62
74
63
- primBool :: J.JBoolean -> JsonPrim
75
+ primBool :: Boolean -> JsonPrim
64
76
primBool v = JsonPrim (\_ f _ _ -> f v)
65
77
66
- primNum :: J.JNumber -> JsonPrim
78
+ primNum :: Number -> JsonPrim
67
79
primNum v = JsonPrim (\_ _ f _ -> f v)
68
80
69
- primStr :: J.JString -> JsonPrim
81
+ primStr :: String -> JsonPrim
70
82
primStr v = JsonPrim (\_ _ _ f -> f v)
71
83
72
84
primToJson :: JsonPrim -> J.Json
73
- primToJson p = runJsonPrim p J .fromNull J .fromBoolean J .fromNumber J .fromString
85
+ primToJson p = runJsonPrim p (const J .jsonNull) J .fromBoolean J .fromNumber J .fromString
74
86
75
87
insideOut :: JCursor -> JCursor
76
88
insideOut JCursorTop = JCursorTop
@@ -91,8 +103,8 @@ downIndex i = downIndex' where
91
103
92
104
cursorGet :: JCursor -> J.Json -> Maybe J.Json
93
105
cursorGet JCursorTop = Just
94
- cursorGet (JField i c) = J .foldJsonObject Nothing (cursorGet c <=< M .lookup i)
95
- cursorGet (JIndex i c) = J .foldJsonArray Nothing (cursorGet c <=< (_ A .!! i))
106
+ cursorGet (JField i c) = J .caseJsonObject Nothing (cursorGet c <=< FO .lookup i)
107
+ cursorGet (JIndex i c) = J .caseJsonArray Nothing (cursorGet c <=< (_ A .!! i))
96
108
97
109
inferEmpty :: JCursor -> J.Json
98
110
inferEmpty JCursorTop = J .jsonNull
@@ -101,25 +113,25 @@ inferEmpty (JIndex _ _) = J.jsonEmptyArray
101
113
102
114
cursorSet :: JCursor -> J.Json -> J.Json -> Maybe J.Json
103
115
cursorSet JCursorTop v = pure <<< const v
104
- cursorSet (JField i c) v = J .foldJsonObject defaultObj mergeObjs
116
+ cursorSet (JField i c) v = J .caseJsonObject defaultObj mergeObjs
105
117
where
106
118
defaultObj :: Maybe J.Json
107
- defaultObj = J .fromObject <<< M .singleton i <$> cursorSet c v (inferEmpty c)
108
- mergeObjs :: J.JObject -> Maybe J.Json
119
+ defaultObj = J .fromObject <<< FO .singleton i <$> cursorSet c v (inferEmpty c)
120
+ mergeObjs :: FO.Object J.Json -> Maybe J.Json
109
121
mergeObjs m
110
122
= J .fromObject
111
- <<< flip (M .insert i) m
112
- <$> cursorSet c v (fromMaybe (inferEmpty c) (M .lookup i m))
113
- cursorSet (JIndex i c) v = J .foldJsonArray defaultArr mergeArrs
123
+ <<< flip (FO .insert i) m
124
+ <$> cursorSet c v (fromMaybe (inferEmpty c) (FO .lookup i m))
125
+ cursorSet (JIndex i c) v = J .caseJsonArray defaultArr mergeArrs
114
126
where
115
127
defaultArr :: Maybe J.Json
116
128
defaultArr
117
129
= J .fromArray
118
130
<$> (flip (A .updateAt i) (replicate (i + 1 ) J .jsonNull) =<< cursorSet c v (inferEmpty c))
119
- mergeArrs :: J.JArray -> Maybe J.Json
131
+ mergeArrs :: Array J.Json -> Maybe J.Json
120
132
mergeArrs a =
121
133
setArr a i =<< cursorSet c v (fromMaybe (inferEmpty c) (a A .!! i))
122
- setArr :: J.JArray -> Int -> J.Json -> Maybe J.Json
134
+ setArr :: Array J.Json -> Int -> J.Json -> Maybe J.Json
123
135
setArr xs i' v' =
124
136
let len = A .length xs
125
137
in if i' < 0
@@ -129,31 +141,31 @@ cursorSet (JIndex i c) v = J.foldJsonArray defaultArr mergeArrs
129
141
else J .fromArray <$> A .updateAt i' v' xs
130
142
131
143
toPrims :: J.Json -> List (Tuple JCursor JsonPrim )
132
- toPrims = J .foldJson nullFn boolFn numFn strFn arrFn objFn
144
+ toPrims = J .caseJson nullFn boolFn numFn strFn arrFn objFn
133
145
where
134
146
mkTop :: JsonPrim -> List (Tuple JCursor JsonPrim )
135
147
mkTop p = singleton $ Tuple JCursorTop p
136
- nullFn :: J.JNull -> List (Tuple JCursor JsonPrim )
148
+ nullFn :: Unit -> List (Tuple JCursor JsonPrim )
137
149
nullFn _ = mkTop primNull
138
- boolFn :: J.JBoolean -> List (Tuple JCursor JsonPrim )
150
+ boolFn :: Boolean -> List (Tuple JCursor JsonPrim )
139
151
boolFn b = mkTop $ primBool b
140
- numFn :: J.JNumber -> List (Tuple JCursor JsonPrim )
152
+ numFn :: Number -> List (Tuple JCursor JsonPrim )
141
153
numFn n = mkTop $ primNum n
142
- strFn :: J.JString -> List (Tuple JCursor JsonPrim )
154
+ strFn :: String -> List (Tuple JCursor JsonPrim )
143
155
strFn s = mkTop $ primStr s
144
- arrFn :: J.JArray -> List (Tuple JCursor JsonPrim )
156
+ arrFn :: Array J.Json -> List (Tuple JCursor JsonPrim )
145
157
arrFn arr =
146
158
let zipped :: List (Tuple Int J.Json )
147
159
zipped = zipWith Tuple (range 0 (A .length arr - 1 )) (fromFoldable arr)
148
160
in zipped >>= arrFn'
149
161
arrFn' :: Tuple Int J.Json -> List (Tuple JCursor JsonPrim )
150
162
arrFn' (Tuple i j) =
151
163
fromFoldable ((\t -> Tuple (JIndex i (fst t)) (snd t)) <$> toPrims j)
152
- objFn :: J.JObject -> List (Tuple JCursor JsonPrim )
164
+ objFn :: FO.Object J.Json -> List (Tuple JCursor JsonPrim )
153
165
objFn obj =
154
166
let f :: Tuple String J.Json -> List (Tuple JCursor JsonPrim )
155
167
f (Tuple i j) = (\t -> Tuple (JField i (fst t)) (snd t)) <$> toPrims j
156
- in M .toUnfoldable obj >>= f
168
+ in FO .toUnfoldable obj >>= f
157
169
158
170
fromPrims :: List (Tuple JCursor JsonPrim ) -> Maybe J.Json
159
171
fromPrims lst = foldl f (inferEmpty <<< fst <$> head lst) lst
@@ -173,7 +185,7 @@ instance decodeJsonJCursor :: DecodeJson JCursor where
173
185
goLoop :: Tuple J.Json (Array J.Json ) -> Either String JCursor
174
186
goLoop (Tuple x xs) = do
175
187
c <- loop xs
176
- J .foldJson fail fail (goNum c) (Right <<< flip JField c) fail fail x
177
- goNum :: JCursor -> J.JNumber -> Either String JCursor
188
+ J .caseJson fail fail (goNum c) (Right <<< flip JField c) (map J .stringify >>> fail) (map J .stringify >>> fail) x
189
+ goNum :: JCursor -> Number -> Either String JCursor
178
190
goNum c =
179
191
maybe (Left " Not an Int" ) (Right <<< flip JIndex c) <<< I .fromNumber
0 commit comments