Skip to content

Commit 3e594a0

Browse files
authored
Merge pull request #18 from purescript-contrib/compiler/0.12
Compiler/0.12
2 parents 16c8a97 + 0c69f1b commit 3e594a0

File tree

8 files changed

+75
-65
lines changed

8 files changed

+75
-65
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
language: node_js
22
dist: trusty
33
sudo: required
4-
node_js: 6
4+
node_js: stable
55
install:
66
- npm install -g bower
77
- npm install

bower.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
},
2222
"license": "MIT",
2323
"dependencies": {
24-
"purescript-argonaut-core": "^3.1.0",
25-
"purescript-argonaut-codecs": "^3.0.0",
26-
"purescript-profunctor-lenses": "^3.0.0"
24+
"purescript-argonaut-core": "^4.0.0",
25+
"purescript-argonaut-codecs": "^4.0.0",
26+
"purescript-profunctor-lenses": "^4.0.0"
2727
},
2828
"devDependencies": {
29-
"purescript-strongcheck": "^3.0.0"
29+
"purescript-quickcheck": "^5.0.0"
3030
}
3131
}

package.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
"test": "pulp test"
77
},
88
"devDependencies": {
9-
"pulp": "^11.0.0",
10-
"purescript-psa": "^0.5.0",
11-
"purescript": "^0.11.0",
12-
"rimraf": "^2.5.4"
9+
"pulp": "^12.2.0",
10+
"purescript": "^0.12.0",
11+
"purescript-psa": "^0.6.0",
12+
"rimraf": "^2.6.2"
1313
}
1414
}

src/Data/Argonaut/JCursor.purs

+43-31
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@ import Data.Argonaut.Decode (class DecodeJson, decodeJson)
77
import Data.Argonaut.Encode (class EncodeJson, encodeJson)
88
import Data.Array as A
99
import Data.Either (Either(..))
10-
import Data.Unfoldable (replicate)
1110
import Data.Foldable (foldl)
1211
import Data.Int as I
1312
import Data.List (List(), zipWith, range, head, singleton, fromFoldable)
1413
import Data.Maybe (Maybe(..), fromMaybe, maybe)
15-
import Data.Monoid (class Monoid)
16-
import Data.StrMap as M
1714
import Data.Tuple (Tuple(..), fst, snd)
15+
import Data.Unfoldable (replicate)
16+
import Foreign.Object as FO
1817

1918
data JCursor
2019
= JCursorTop
@@ -49,28 +48,41 @@ instance encodeJsonJCursor :: EncodeJson JCursor where
4948
loop (JField i c) = [encodeJson i] <> loop c
5049
loop (JIndex i c) = [encodeJson i] <> loop c
5150

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)
5567
runJsonPrim (JsonPrim p) = p
5668

5769
instance showJsonPrim :: Show JsonPrim where
5870
show p = runJsonPrim p show show show show
5971

6072
primNull :: JsonPrim
61-
primNull = JsonPrim (\f _ _ _ -> f J.jNull)
73+
primNull = JsonPrim (\f _ _ _ -> f unit)
6274

63-
primBool :: J.JBoolean -> JsonPrim
75+
primBool :: Boolean -> JsonPrim
6476
primBool v = JsonPrim (\_ f _ _ -> f v)
6577

66-
primNum :: J.JNumber -> JsonPrim
78+
primNum :: Number -> JsonPrim
6779
primNum v = JsonPrim (\_ _ f _ -> f v)
6880

69-
primStr :: J.JString -> JsonPrim
81+
primStr :: String -> JsonPrim
7082
primStr v = JsonPrim (\_ _ _ f -> f v)
7183

7284
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
7486

7587
insideOut :: JCursor -> JCursor
7688
insideOut JCursorTop = JCursorTop
@@ -91,8 +103,8 @@ downIndex i = downIndex' where
91103

92104
cursorGet :: JCursor -> J.Json -> Maybe J.Json
93105
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))
96108

97109
inferEmpty :: JCursor -> J.Json
98110
inferEmpty JCursorTop = J.jsonNull
@@ -101,25 +113,25 @@ inferEmpty (JIndex _ _) = J.jsonEmptyArray
101113

102114
cursorSet :: JCursor -> J.Json -> J.Json -> Maybe J.Json
103115
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
105117
where
106118
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
109121
mergeObjs m
110122
= 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
114126
where
115127
defaultArr :: Maybe J.Json
116128
defaultArr
117129
= J.fromArray
118130
<$> (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
120132
mergeArrs a =
121133
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
123135
setArr xs i' v' =
124136
let len = A.length xs
125137
in if i' < 0
@@ -129,31 +141,31 @@ cursorSet (JIndex i c) v = J.foldJsonArray defaultArr mergeArrs
129141
else J.fromArray <$> A.updateAt i' v' xs
130142

131143
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
133145
where
134146
mkTop :: JsonPrim -> List (Tuple JCursor JsonPrim)
135147
mkTop p = singleton $ Tuple JCursorTop p
136-
nullFn :: J.JNull -> List (Tuple JCursor JsonPrim)
148+
nullFn :: Unit -> List (Tuple JCursor JsonPrim)
137149
nullFn _ = mkTop primNull
138-
boolFn :: J.JBoolean -> List (Tuple JCursor JsonPrim)
150+
boolFn :: Boolean -> List (Tuple JCursor JsonPrim)
139151
boolFn b = mkTop $ primBool b
140-
numFn :: J.JNumber -> List (Tuple JCursor JsonPrim)
152+
numFn :: Number -> List (Tuple JCursor JsonPrim)
141153
numFn n = mkTop $ primNum n
142-
strFn :: J.JString -> List (Tuple JCursor JsonPrim)
154+
strFn :: String -> List (Tuple JCursor JsonPrim)
143155
strFn s = mkTop $ primStr s
144-
arrFn :: J.JArray -> List (Tuple JCursor JsonPrim)
156+
arrFn :: Array J.Json -> List (Tuple JCursor JsonPrim)
145157
arrFn arr =
146158
let zipped :: List (Tuple Int J.Json)
147159
zipped = zipWith Tuple (range 0 (A.length arr - 1)) (fromFoldable arr)
148160
in zipped >>= arrFn'
149161
arrFn' :: Tuple Int J.Json -> List (Tuple JCursor JsonPrim)
150162
arrFn' (Tuple i j) =
151163
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)
153165
objFn obj =
154166
let f :: Tuple String J.Json -> List (Tuple JCursor JsonPrim)
155167
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
157169

158170
fromPrims :: List (Tuple JCursor JsonPrim) -> Maybe J.Json
159171
fromPrims lst = foldl f (inferEmpty <<< fst <$> head lst) lst
@@ -173,7 +185,7 @@ instance decodeJsonJCursor :: DecodeJson JCursor where
173185
goLoop :: Tuple J.Json (Array J.Json) -> Either String JCursor
174186
goLoop (Tuple x xs) = do
175187
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
178190
goNum c =
179191
maybe (Left "Not an Int") (Right <<< flip JIndex c) <<< I.fromNumber

src/Data/Argonaut/JCursor/Gen.purs

+2-5
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,13 @@ import Control.Monad.Gen as Gen
88
import Control.Monad.Rec.Class (class MonadRec)
99

1010
import Data.Argonaut.JCursor (JCursor(..))
11-
import Data.Char as C
12-
import Data.String as S
11+
import Data.String.Gen (genUnicodeString)
1312

1413
genJCursor :: forall m. MonadGen m => MonadRec m => Lazy (m JCursor) => m JCursor
1514
genJCursor = Gen.resize (min 10) $ Gen.sized genJCursor'
1615
where
1716
genJCursor' size
1817
| size > 0 = Gen.resize (_ - 1) (Gen.choose genField genIndex)
1918
| otherwise = pure JCursorTop
20-
genField = JField <$> genString <*> defer \_ -> genJCursor
19+
genField = JField <$> genUnicodeString <*> defer \_ -> genJCursor
2120
genIndex = JIndex <$> Gen.chooseInt 0 1000 <*> defer \_ -> genJCursor
22-
genString = S.fromCharArray <$> Gen.unfoldable genChar
23-
genChar = C.fromCharCode <$> Gen.chooseInt 0 65535

src/Data/Argonaut/Prisms.purs

+9-7
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,23 @@ module Data.Argonaut.Prisms where
22

33
import Data.Argonaut.Core
44
import Data.Lens (Prism', prism')
5+
import Foreign.Object as FO
6+
import Prelude (Unit, const)
57

6-
_Null :: Prism' Json JNull
7-
_Null = prism' fromNull toNull
8+
_Null :: Prism' Json Unit
9+
_Null = prism' (const jsonNull) toNull
810

9-
_Boolean :: Prism' Json JBoolean
11+
_Boolean :: Prism' Json Boolean
1012
_Boolean = prism' fromBoolean toBoolean
1113

12-
_Number :: Prism' Json JNumber
14+
_Number :: Prism' Json Number
1315
_Number = prism' fromNumber toNumber
1416

15-
_String :: Prism' Json JString
17+
_String :: Prism' Json String
1618
_String = prism' fromString toString
1719

18-
_Array :: Prism' Json JArray
20+
_Array :: Prism' Json (Array Json)
1921
_Array = prism' fromArray toArray
2022

21-
_Object :: Prism' Json JObject
23+
_Object :: Prism' Json (FO.Object Json)
2224
_Object = prism' fromObject toObject

src/Data/Argonaut/Traversals.purs

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
module Data.Argonaut.Traversals where
22

3-
import Prelude ((<<<), id)
3+
import Prelude ((<<<), identity)
44
import Data.Argonaut.Core
55
import Data.Lens (Traversal', filtered)
66

77
_JsonNull :: Traversal' Json Json
8-
_JsonNull = id <<< filtered isNull
8+
_JsonNull = identity <<< filtered isNull
99

1010
_JsonBoolean :: Traversal' Json Json
11-
_JsonBoolean = id <<< filtered isBoolean
11+
_JsonBoolean = identity <<< filtered isBoolean
1212

1313
_JsonNumber :: Traversal' Json Json
14-
_JsonNumber = id <<< filtered isNumber
14+
_JsonNumber = identity <<< filtered isNumber
1515

1616
_JsonString :: Traversal' Json Json
17-
_JsonString = id <<< filtered isString
17+
_JsonString = identity <<< filtered isString
1818

1919
_JsonArray :: Traversal' Json Json
20-
_JsonArray = id <<< filtered isArray
20+
_JsonArray = identity <<< filtered isArray
2121

2222
_JsonObject :: Traversal' Json Json
23-
_JsonObject = id <<< filtered isObject
23+
_JsonObject = identity <<< filtered isObject

test/Test/Main.purs

+5-6
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,21 @@ module Test.Main where
22

33
import Prelude
44

5-
import Control.Monad.Eff.Console (log)
6-
75
import Data.Argonaut.Decode (decodeJson)
86
import Data.Argonaut.Encode (encodeJson)
97
import Data.Argonaut.JCursor.Gen (genJCursor)
108
import Data.Either (Either(..))
11-
12-
import Test.StrongCheck (SC, Result, quickCheck, (<?>))
13-
import Test.StrongCheck.Gen (Gen)
9+
import Effect (Effect)
10+
import Effect.Console (log)
11+
import Test.QuickCheck (Result, quickCheck, (<?>))
12+
import Test.QuickCheck.Gen (Gen)
1413

1514
prop_jcursor_serialization :: Gen Result
1615
prop_jcursor_serialization = do
1716
c <- genJCursor
1817
pure $ (decodeJson (encodeJson c) == Right c) <?> "JCursor: " <> show c
1918

20-
main :: SC () Unit
19+
main :: Effect Unit
2120
main = do
2221
log "Testing JCursor serialization"
2322
quickCheck prop_jcursor_serialization

0 commit comments

Comments
 (0)