11module 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
1617import Prelude hiding (map , void )
1718
19+ import Data.Argonaut.Core (Json )
1820import Data.Array as Array
1921import Data.Array.NonEmpty as NEA
22+ import Data.Bifunctor (lmap )
23+ import Data.Codec as Codec
2024import 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 , (<~<), (>~>), (~))
2125import Data.Codec.Argonaut.Sum (taggedSum )
2226import Data.Either (Either (..))
27+ import Data.FoldableWithIndex (forWithIndex_ )
2328import Data.Functor as F
2429import Data.List as List
2530import Data.List.NonEmpty as NEL
@@ -29,8 +34,10 @@ import Data.Profunctor (dimap)
2934import Data.Set as Set
3035import Data.Set.NonEmpty as NESet
3136import Data.String.NonEmpty as NEString
37+ import Data.TraversableWithIndex (traverseWithIndex )
3238import Data.Tuple (Tuple (..), fst , snd )
3339import 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
110117map ∷ ∀ a b . Ord a ⇒ JsonCodec a → JsonCodec b → JsonCodec (Map.Map a b )
111118map 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)
122146nonEmptySet ∷ ∀ a . Ord a ⇒ JsonCodec a → JsonCodec (NESet.NonEmptySet a )
123147nonEmptySet 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.
128152foreignObject ∷ ∀ a . JsonCodec a → JsonCodec (Object.Object a )
0 commit comments