Skip to content

Commit 8b169ed

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents 2a98b21 + f8334e9 commit 8b169ed

File tree

4 files changed

+52
-6
lines changed

4 files changed

+52
-6
lines changed

bower.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
"purescript-maybe": "^4.0.0",
2828
"purescript-ordered-collections": "^1.0.0",
2929
"purescript-foreign-object": "^1.0.0",
30-
"purescript-record": "^1.0.0"
30+
"purescript-record": "^1.0.0",
31+
"purescript-nonempty": "^5.0.0",
32+
"purescript-arrays": "^5.1.0"
3133
},
3234
"devDependencies": {
3335
"purescript-test-unit": "^14.0.0"

src/Data/Argonaut/Decode/Class.purs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ module Data.Argonaut.Decode.Class where
33
import Prelude
44

55
import Data.Argonaut.Core (Json, isNull, caseJsonNull, caseJsonBoolean, caseJsonNumber, caseJsonString, toArray, toObject, toString, stringify)
6-
import Data.Bifunctor (lmap)
7-
import Data.Either (Either(..))
6+
import Data.Array as Arr
7+
import Data.Bifunctor (lmap, rmap)
8+
import Data.Either (Either(..), note)
89
import Data.Int (fromNumber)
910
import Data.List (List(..), (:), fromFoldable)
11+
import Data.List as L
1012
import Data.Map as M
1113
import Data.Maybe (maybe, Maybe(..))
14+
import Data.NonEmpty (NonEmpty, (:|))
1215
import Data.String (CodePoint, codePointAt)
1316
import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol)
1417
import Data.Traversable (traverse)
@@ -66,6 +69,16 @@ instance decodeJsonString :: DecodeJson String where
6669
instance decodeJsonJson :: DecodeJson Json where
6770
decodeJson = Right
6871

72+
instance decodeJsonNonEmptyArray :: (DecodeJson a) => DecodeJson (NonEmpty Array a) where
73+
decodeJson
74+
= lmap ("Couldn't decode NonEmpty Array: " <> _)
75+
<<< (traverse decodeJson <=< (lmap ("JSON Array" <> _) <<< rmap (\x -> x.head :| x.tail) <<< note " is empty" <<< Arr.uncons) <=< decodeJArray)
76+
77+
instance decodeJsonNonEmptyList :: (DecodeJson a) => DecodeJson (NonEmpty List a) where
78+
decodeJson
79+
= lmap ("Couldn't decode NonEmpty List: " <> _)
80+
<<< (traverse decodeJson <=< (lmap ("JSON Array" <> _) <<< rmap (\x -> x.head :| x.tail) <<< note " is empty" <<< L.uncons) <=< map (map fromFoldable) decodeJArray)
81+
6982
instance decodeJsonChar :: DecodeJson CodePoint where
7083
decodeJson j =
7184
maybe (Left $ "Expected character but found: " <> stringify j) Right

src/Data/Argonaut/Encode/Class.purs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ module Data.Argonaut.Encode.Class where
33
import Prelude
44

55
import Data.Argonaut.Core (Json, fromArray, fromBoolean, fromNumber, fromObject, fromString, jsonNull)
6+
import Data.Array as Arr
67
import Data.Either (Either, either)
78
import Data.Int (toNumber)
89
import Data.List (List(..), (:), toUnfoldable)
10+
import Data.List as L
911
import Data.Map as M
1012
import Data.Maybe (Maybe(..))
13+
import Data.NonEmpty (NonEmpty(..))
1114
import Data.String (CodePoint)
1215
import Data.String.CodePoints as CP
1316
import Data.String.CodeUnits as CU
@@ -58,6 +61,12 @@ instance encodeJsonJson :: EncodeJson Json where
5861
instance encodeJsonCodePoint :: EncodeJson CodePoint where
5962
encodeJson = encodeJson <<< CP.singleton
6063

64+
instance encodeJsonNonEmptyArray :: (EncodeJson a) => EncodeJson (NonEmpty Array a) where
65+
encodeJson (NonEmpty h t) = encodeJson $ Arr.cons h t
66+
67+
instance encodeJsonNonEmptyList :: (EncodeJson a) => EncodeJson (NonEmpty List a) where
68+
encodeJson (NonEmpty h t) = encodeJson $ L.insertAt 0 h t
69+
6170
instance encodeJsonChar :: EncodeJson Char where
6271
encodeJson = encodeJson <<< CU.singleton
6372

test/Test/Main.purs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import Data.Argonaut.Parser (jsonParser)
1111
import Data.Bifunctor (rmap)
1212
import Data.Either (Either(..))
1313
import Data.Foldable (foldl)
14+
import Data.List (List)
1415
import Data.Maybe (Maybe(..), isJust, isNothing, maybe)
16+
import Data.NonEmpty (NonEmpty)
1517
import Data.String.Gen (genUnicodeString)
1618
import Data.Tuple (Tuple(..))
1719
import Effect (Effect)
@@ -28,10 +30,11 @@ import Test.Unit.QuickCheck (quickCheck)
2830
main :: Effect Unit
2931
main = runTest do
3032
suite "Either Check" eitherCheck
33+
suite "Encode/Decode NonEmpty Check" nonEmptyCheck
3134
suite "Encode/Decode Checks" encodeDecodeCheck
3235
suite "Encode/Decode Record Checks" encodeDecodeRecordCheck
3336
suite "Combinators Checks" combinatorsCheck
34-
suite "Manual Combinators Checks" manualCombinatorsCheck
37+
suite "Manual Combinators Checks" manualRecordDecode
3538
suite "Error Message Checks" errorMsgCheck
3639

3740

@@ -158,8 +161,8 @@ eitherCheck = do
158161
Left err ->
159162
false <?> err
160163

161-
manualCombinatorsCheck :: TestSuite
162-
manualCombinatorsCheck = do
164+
manualRecordDecode :: TestSuite
165+
manualRecordDecode = do
163166
test "Test that decoding custom record is successful" do
164167
case decodeJson =<< jsonParser fooJson of
165168
Right (Foo _) -> success
@@ -261,6 +264,25 @@ manualCombinatorsCheck = do
261264
fooNestedFullJson :: String
262265
fooNestedFullJson = """{ "bar": [1], "baz": true }"""
263266

267+
nonEmptyCheck :: TestSuite
268+
nonEmptyCheck = do
269+
test "Test EncodeJson/DecodeJson on NonEmpty Array" do
270+
quickCheck \(x :: NonEmpty Array String) ->
271+
case decodeJson (encodeJson x) of
272+
Right decoded ->
273+
decoded == x
274+
<?> ("x = " <> show x <> ", decoded = " <> show decoded)
275+
Left err ->
276+
false <?> err
277+
test "Test EncodeJson/DecodeJson on NonEmpty List" do
278+
quickCheck \(x :: NonEmpty List String) ->
279+
case decodeJson (encodeJson x) of
280+
Right decoded ->
281+
decoded == x
282+
<?> ("x = " <> show x <> ", decoded = " <> show decoded)
283+
Left err ->
284+
false <?> err
285+
264286
errorMsgCheck :: TestSuite
265287
errorMsgCheck = do
266288
test "Test that decoding array fails with the proper message" do

0 commit comments

Comments
 (0)