1
1
module Data.Codec.Argonaut.Common
2
- ( nonEmptyString
3
- , nonEmptyArray
4
- , maybe
5
- , tuple
6
- , either
2
+ ( either
3
+ , foreignObject
7
4
, list
8
- , nonEmptyList
9
5
, map
10
- , set
11
- , nonEmptySet
12
- , foreignObject
6
+ , maybe
13
7
, module Data.Codec.Argonaut
8
+ , nonEmptyArray
9
+ , nonEmptyList
10
+ , nonEmptySet
11
+ , nonEmptyString
12
+ , set
13
+ , strMap
14
+ , tuple
14
15
) where
15
16
16
17
import Prelude hiding (map , void )
17
18
19
+ import Data.Argonaut.Core (Json )
18
20
import Data.Array as Array
19
21
import Data.Array.NonEmpty as NEA
22
+ import Data.Bifunctor (lmap )
23
+ import Data.Codec as Codec
20
24
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 , (<~<), (>~>), (~))
21
25
import Data.Codec.Argonaut.Sum (taggedSum )
22
26
import Data.Either (Either (..))
27
+ import Data.FoldableWithIndex (forWithIndex_ )
23
28
import Data.Functor as F
24
29
import Data.List as List
25
30
import Data.List.NonEmpty as NEL
@@ -29,8 +34,10 @@ import Data.Profunctor (dimap)
29
34
import Data.Set as Set
30
35
import Data.Set.NonEmpty as NESet
31
36
import Data.String.NonEmpty as NEString
37
+ import Data.TraversableWithIndex (traverseWithIndex )
32
38
import Data.Tuple (Tuple (..), fst , snd )
33
39
import Foreign.Object as Object
40
+ import Foreign.Object.ST as ObjectST
34
41
35
42
-- | A codec for `NonEmptyString` values.
36
43
-- |
@@ -110,6 +117,23 @@ nonEmptyList codec = prismaticCodec "NonEmptyList" NEL.fromFoldable Array.fromFo
110
117
map ∷ ∀ a b . Ord a ⇒ JsonCodec a → JsonCodec b → JsonCodec (Map.Map a b )
111
118
map codecA codecB = dimap Map .toUnfoldable (Map .fromFoldable) (named " Map" (array (tuple codecA codecB)))
112
119
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
+
113
137
-- | A codec for `Set` values.
114
138
-- |
115
139
-- | Encodes as an array in JSON.
@@ -122,7 +146,7 @@ set codec = dimap Array.fromFoldable Set.fromFoldable (named "Set" (array codec)
122
146
nonEmptySet ∷ ∀ a . Ord a ⇒ JsonCodec a → JsonCodec (NESet.NonEmptySet a )
123
147
nonEmptySet codec = prismaticCodec " NonEmptySet" NESet .fromFoldable NESet .toUnfoldable (array codec)
124
148
125
- -- | A codec for `StrMap ` values.
149
+ -- | A codec for `Object ` values.
126
150
-- |
127
151
-- | Encodes as an array of two-element key/value arrays in JSON.
128
152
foreignObject ∷ ∀ a . JsonCodec a → JsonCodec (Object.Object a )
0 commit comments