Skip to content

Commit d6c26da

Browse files
authored
Merge pull request #55 from thomashoneyman/trh/strmap
Add strMap
2 parents b0929b2 + 71f1861 commit d6c26da

File tree

4 files changed

+25
-15
lines changed

4 files changed

+25
-15
lines changed

bower.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
"purescript-codec": "^6.0.0",
2121
"purescript-variant": "^8.0.0",
2222
"purescript-ordered-collections": "^3.0.0",
23-
"purescript-type-equality": "^4.0.1"
23+
"purescript-type-equality": "^4.0.1",
24+
"purescript-foreign-object": "^4.1.0"
2425
},
2526
"devDependencies": {
2627
"purescript-argonaut-codecs": "^9.1.0",

src/Data/Codec/Argonaut/Common.purs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,9 @@
11
module Data.Codec.Argonaut.Common
2-
( nonEmptyString
3-
, nonEmptyArray
4-
, maybe
5-
, tuple
6-
, either
7-
, list
8-
, nonEmptyList
9-
, map
10-
, set
11-
, nonEmptySet
12-
, foreignObject
2+
( module Data.Codec.Argonaut.Common
133
, module Data.Codec.Argonaut
144
) where
155

16-
import Prelude hiding (map, void, identity)
6+
import Prelude hiding (identity, map, void)
177

188
import Data.Array as Array
199
import Data.Array.NonEmpty as NEA
@@ -29,6 +19,7 @@ import Data.Profunctor (dimap)
2919
import Data.Set as Set
3020
import Data.Set.NonEmpty as NESet
3121
import Data.String.NonEmpty as NEString
22+
import Data.Traversable (traverse)
3223
import Data.Tuple (Tuple(..), fst, snd)
3324
import Foreign.Object as Object
3425

@@ -110,6 +101,15 @@ nonEmptyList codec = prismaticCodec "NonEmptyList" NEL.fromFoldable Array.fromFo
110101
map a b. Ord a JsonCodec a JsonCodec b JsonCodec (Map.Map a b)
111102
map codecA codecB = dimap Map.toUnfoldable (Map.fromFoldable) (named "Map" (array (tuple codecA codecB)))
112103

104+
-- | A codec for `Map` values which have string keys.
105+
-- |
106+
-- | Encodes as an object in JSON.
107+
strMap a. JsonCodec a JsonCodec (Map.Map String a)
108+
strMap codec =
109+
codec'
110+
(F.map Map.fromFoldableWithIndex <<< traverse (decode codec) <=< decode jobject)
111+
(encode jobject <<< Object.fromFoldableWithIndex <<< F.map (encode codec))
112+
113113
-- | A codec for `Set` values.
114114
-- |
115115
-- | Encodes as an array in JSON.
@@ -122,7 +122,7 @@ set codec = dimap Array.fromFoldable Set.fromFoldable (named "Set" (array codec)
122122
nonEmptySet a. Ord a JsonCodec a JsonCodec (NESet.NonEmptySet a)
123123
nonEmptySet codec = prismaticCodec "NonEmptySet" NESet.fromFoldable NESet.toUnfoldable (array codec)
124124

125-
-- | A codec for `StrMap` values.
125+
-- | A codec for `Object` values.
126126
-- |
127127
-- | Encodes as an array of two-element key/value arrays in JSON.
128128
foreignObject a. JsonCodec a JsonCodec (Object.Object a)

src/Data/Codec/Argonaut/Compat.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Prelude hiding (identity, map, void)
99
import Data.Argonaut.Core as J
1010
import Data.Bifunctor as BF
1111
import Data.Codec as Codec
12-
import Data.Codec.Argonaut.Common (Codec(..), Codec', JIndexedCodec, JPropCodec, JsonCodec, JsonDecodeError(..), array, boolean, char, codePoint, codec, codec', coercible, decode, either, encode, fix, hoist, identity, index, indexedArray, int, jarray, jobject, json, list, map, named, nonEmptyArray, nonEmptyList, nonEmptySet, nonEmptyString, null, number, object, printJsonDecodeError, prismaticCodec, prop, record, recordProp, recordPropOptional, set, string, tuple, void, (<~<), (>~>), (~))
12+
import Data.Codec.Argonaut.Common (Codec(..), Codec', JIndexedCodec, JPropCodec, JsonCodec, JsonDecodeError(..), array, boolean, char, codePoint, codec, codec', coercible, decode, either, encode, fix, hoist, identity, index, indexedArray, int, jarray, jobject, json, list, map, named, nonEmptyArray, nonEmptyList, nonEmptySet, nonEmptyString, null, number, object, printJsonDecodeError, prismaticCodec, prop, record, recordProp, recordPropOptional, set, strMap, string, tuple, void, (<~<), (>~>), (~))
1313
import Data.Either (Either)
1414
import Data.Functor as Functor
1515
import Data.Maybe (Maybe(..))

test/Test/Common.purs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ main = do
3131
log "Checking StrMap codec"
3232
quickCheck propStrMapCodec
3333

34+
log "Checking Object codec"
35+
quickCheck propObjectCodec
36+
3437
propMaybeCodec Gen Result
3538
propMaybeCodec =
3639
propCodec
@@ -57,6 +60,12 @@ propMapCodec =
5760

5861
propStrMapCodec Gen Result
5962
propStrMapCodec =
63+
propCodec
64+
(genMap genAsciiString genInt)
65+
(JA.strMap JA.int)
66+
67+
propObjectCodec Gen Result
68+
propObjectCodec =
6069
propCodec
6170
(genForeignObject genAsciiString genInt)
6271
(JA.foreignObject JA.int)

0 commit comments

Comments
 (0)