Skip to content

Commit 4cb4b98

Browse files
Add strMap
1 parent 42bb14b commit 4cb4b98

File tree

2 files changed

+43
-10
lines changed

2 files changed

+43
-10
lines changed

src/Data/Codec/Argonaut/Common.purs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
module Data.Codec.Argonaut.Common
2-
( nonEmptyString
3-
, nonEmptyArray
4-
, maybe
5-
, tuple
6-
, either
2+
( either
3+
, foreignObject
74
, list
8-
, nonEmptyList
95
, map
10-
, set
11-
, nonEmptySet
12-
, foreignObject
6+
, maybe
137
, module Data.Codec.Argonaut
8+
, nonEmptyArray
9+
, nonEmptyList
10+
, nonEmptySet
11+
, nonEmptyString
12+
, set
13+
, strMap
14+
, tuple
1415
) where
1516

1617
import Prelude hiding (map, void)
1718

19+
import Data.Argonaut.Core (Json)
1820
import Data.Array as Array
1921
import Data.Array.NonEmpty as NEA
22+
import Data.Bifunctor (lmap)
23+
import Data.Codec as Codec
2024
import Data.Codec.Argonaut (JIndexedCodec, JPropCodec, JsonCodec, JsonDecodeError(..), array, boolean, char, codePoint, coercible, decode, encode, fix, index, indexedArray, int, jarray, jobject, json, named, null, number, object, printJsonDecodeError, prismaticCodec, prop, record, recordProp, recordPropOptional, string, void, (<~<), (>~>), (~))
2125
import Data.Codec.Argonaut.Sum (taggedSum)
2226
import Data.Either (Either(..))
27+
import Data.FoldableWithIndex (forWithIndex_)
2328
import Data.Functor as F
2429
import Data.List as List
2530
import Data.List.NonEmpty as NEL
@@ -29,8 +34,10 @@ import Data.Profunctor (dimap)
2934
import Data.Set as Set
3035
import Data.Set.NonEmpty as NESet
3136
import Data.String.NonEmpty as NEString
37+
import Data.TraversableWithIndex (traverseWithIndex)
3238
import Data.Tuple (Tuple(..), fst, snd)
3339
import Foreign.Object as Object
40+
import Foreign.Object.ST as ObjectST
3441

3542
-- | A codec for `NonEmptyString` values.
3643
-- |
@@ -110,6 +117,23 @@ nonEmptyList codec = prismaticCodec "NonEmptyList" NEL.fromFoldable Array.fromFo
110117
map a b. Ord a JsonCodec a JsonCodec b JsonCodec (Map.Map a b)
111118
map codecA codecB = dimap Map.toUnfoldable (Map.fromFoldable) (named "Map" (array (tuple codecA codecB)))
112119

120+
-- | A codec for `Map` values which have string keys.
121+
-- |
122+
-- | Encodes as an object in JSON.
123+
strMap a. JsonCodec a JsonCodec (Map.Map String a)
124+
strMap codec = Codec.basicCodec decode encode
125+
where
126+
encode Map.Map String a Json
127+
encode msa = Codec.encode jobject $ Object.runST do
128+
obj ← ObjectST.new
129+
forWithIndex_ msa \k v → ObjectST.poke k (Codec.encode codec v) obj
130+
pure obj
131+
132+
decode Json Either JsonDecodeError (Map.Map String a)
133+
decode json = do
134+
r ← Map.fromFoldableWithIndex <$> Codec.decode jobject json
135+
traverseWithIndex (\k v → lmap (AtKey k) (Codec.decode codec v)) r
136+
113137
-- | A codec for `Set` values.
114138
-- |
115139
-- | Encodes as an array in JSON.
@@ -122,7 +146,7 @@ set codec = dimap Array.fromFoldable Set.fromFoldable (named "Set" (array codec)
122146
nonEmptySet a. Ord a JsonCodec a JsonCodec (NESet.NonEmptySet a)
123147
nonEmptySet codec = prismaticCodec "NonEmptySet" NESet.fromFoldable NESet.toUnfoldable (array codec)
124148

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

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)