From 0fafbdd196aae830740de17ac71da1e3288b02f0 Mon Sep 17 00:00:00 2001 From: Bakhtiyar Neyman Date: Sun, 2 Mar 2025 03:03:42 -0800 Subject: [PATCH 1/2] Const instance. --- bower.json | 1 + spago.dhall | 1 + src/Data/Argonaut/Decode/Class.purs | 4 ++++ src/Data/Argonaut/Decode/Decoders.purs | 8 ++++++++ src/Data/Argonaut/Encode/Class.purs | 4 ++++ src/Data/Argonaut/Encode/Encoders.purs | 4 ++++ 6 files changed, 22 insertions(+) diff --git a/bower.json b/bower.json index a421895..f0eb696 100644 --- a/bower.json +++ b/bower.json @@ -17,6 +17,7 @@ "purescript-argonaut-core": "^7.0.0", "purescript-arrays": "^7.0.0", "purescript-bifunctors": "^6.0.0", + "purescript-const": "^6.0.0", "purescript-effect": "^4.0.0", "purescript-either": "^6.0.0", "purescript-foldable-traversable": "^6.0.0", diff --git a/spago.dhall b/spago.dhall index 3d4f73d..dd2937f 100644 --- a/spago.dhall +++ b/spago.dhall @@ -8,6 +8,7 @@ , "assert" , "bifunctors" , "console" + , "const" , "effect" , "either" , "exceptions" diff --git a/src/Data/Argonaut/Decode/Class.purs b/src/Data/Argonaut/Decode/Class.purs index ec71f5e..932774e 100644 --- a/src/Data/Argonaut/Decode/Class.purs +++ b/src/Data/Argonaut/Decode/Class.purs @@ -6,6 +6,7 @@ import Data.Argonaut.Core (Json, toObject) import Data.Argonaut.Decode.Error (JsonDecodeError(..)) import Data.Array.NonEmpty (NonEmptyArray) import Data.Bifunctor (lmap) +import Data.Const (Const) import Data.Either (Either(..)) import Data.Identity (Identity) import Data.List (List) @@ -31,6 +32,9 @@ class DecodeJson a where instance decodeIdentity :: DecodeJson a => DecodeJson (Identity a) where decodeJson = decodeIdentity decodeJson +instance decodeConst :: DecodeJson a => DecodeJson (Const a b) where + decodeJson = decodeConst decodeJson + instance decodeJsonMaybe :: DecodeJson a => DecodeJson (Maybe a) where decodeJson = decodeMaybe decodeJson diff --git a/src/Data/Argonaut/Decode/Decoders.purs b/src/Data/Argonaut/Decode/Decoders.purs index cf3c0ca..62cd7e1 100644 --- a/src/Data/Argonaut/Decode/Decoders.purs +++ b/src/Data/Argonaut/Decode/Decoders.purs @@ -8,6 +8,7 @@ import Data.Array as Arr import Data.Array.NonEmpty (NonEmptyArray) import Data.Array.NonEmpty as NEA import Data.Bifunctor (lmap) +import Data.Const (Const(..)) import Data.Either (Either(..), note) import Data.Identity (Identity(..)) import Data.Int (fromNumber) @@ -35,6 +36,13 @@ decodeIdentity -> Either JsonDecodeError (Identity a) decodeIdentity decoder json = Identity <$> decoder json +decodeConst + :: forall a b + . (Json -> Either JsonDecodeError a) + -> Json + -> Either JsonDecodeError (Const a b) +decodeConst decoder json = Const <$> decoder json + decodeMaybe :: forall a . (Json -> Either JsonDecodeError a) diff --git a/src/Data/Argonaut/Encode/Class.purs b/src/Data/Argonaut/Encode/Class.purs index c4a80b8..ec540cf 100644 --- a/src/Data/Argonaut/Encode/Class.purs +++ b/src/Data/Argonaut/Encode/Class.purs @@ -5,6 +5,7 @@ import Data.Argonaut.Encode.Encoders import Data.Argonaut.Core (Json, fromObject) import Data.Array.NonEmpty (NonEmptyArray) import Data.String.NonEmpty (NonEmptyString) +import Data.Const (Const) import Data.Either (Either) import Data.Identity (Identity) import Data.List (List) @@ -29,6 +30,9 @@ class EncodeJson a where instance encodeIdentity :: EncodeJson a => EncodeJson (Identity a) where encodeJson = encodeIdentity encodeJson +instance encodeConst :: EncodeJson a => EncodeJson (Const a b) where + encodeJson = encodeConst encodeJson + instance encodeJsonMaybe :: EncodeJson a => EncodeJson (Maybe a) where encodeJson = encodeMaybe encodeJson diff --git a/src/Data/Argonaut/Encode/Encoders.purs b/src/Data/Argonaut/Encode/Encoders.purs index aad0596..d02bfac 100644 --- a/src/Data/Argonaut/Encode/Encoders.purs +++ b/src/Data/Argonaut/Encode/Encoders.purs @@ -6,6 +6,7 @@ import Data.Argonaut.Core (Json, fromArray, fromBoolean, fromNumber, fromObject, import Data.Array as Arr import Data.Array.NonEmpty (NonEmptyArray) import Data.Array.NonEmpty as NEA +import Data.Const (Const(..)) import Data.Either (Either, either) import Data.Identity (Identity(..)) import Data.Int (toNumber) @@ -27,6 +28,9 @@ import Foreign.Object as FO encodeIdentity :: forall a. (a -> Json) -> Identity a -> Json encodeIdentity encoder (Identity a) = encoder a +encodeConst :: forall a b. (a -> Json) -> Const a b -> Json +encodeConst encoder (Const a) = encoder a + encodeMaybe :: forall a. (a -> Json) -> Maybe a -> Json encodeMaybe encoder = case _ of Nothing -> jsonNull From abfcb4a035218eac1f329cc076a451f5322fd9ac Mon Sep 17 00:00:00 2001 From: Bakhtiyar Neyman Date: Sun, 2 Mar 2025 22:34:25 -0800 Subject: [PATCH 2/2] Update changelog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 378f813..1e0cb5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ New features: Bugfixes: Other improvements: + - Decoding and encoding of the `Const` functor. (#118 by @bakhtiyarneyman) ## [v9.0.0](https://github.com/purescript-contrib/purescript-argonaut-codecs/releases/tag/v9.1.0) - 2022-06-23