Skip to content

Commit 1efb3b9

Browse files
committed
Add coercible
1 parent 90be05a commit 1efb3b9

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

src/Data/Codec/Argonaut.purs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ module Data.Codec.Argonaut
2525
, recordPropOptional
2626
, fix
2727
, prismaticCodec
28+
, coercible
2829
, module Exports
2930
) where
3031

@@ -34,6 +35,7 @@ import Control.Monad.Reader (ReaderT(..), runReaderT)
3435
import Control.Monad.Writer (Writer, mapWriter, writer)
3536
import Data.Argonaut.Core as J
3637
import Data.Array as A
38+
import Data.Bifunctor (bimap)
3739
import Data.Bifunctor as BF
3840
import Data.Codec (BasicCodec, Codec, GCodec(..), basicCodec, bihoistGCodec, decode, encode)
3941
import Data.Codec (decode, encode, (<~<), (>~>), (~)) as Exports
@@ -51,7 +53,9 @@ import Data.Traversable (traverse)
5153
import Data.Tuple (Tuple(..))
5254
import Foreign.Object as FO
5355
import Partial.Unsafe (unsafePartial)
56+
import Prim.Coerce (class Coercible)
5457
import Prim.Row as Row
58+
import Safe.Coerce (coerce)
5559
import Type.Proxy (Proxy)
5660
import Unsafe.Coerce (unsafeCoerce)
5761

@@ -413,3 +417,13 @@ prismaticCodec name f g orig =
413417
basicCodec
414418
(\json' → note (Named name (UnexpectedValue json')) <<< f =<< decode orig json')
415419
(encode orig <<< g)
420+
421+
-- | A codec for types that can be safely coerced.
422+
-- |
423+
-- | Accepts the name of the target type as an argument to improve error messaging when the inner
424+
-- | codec fails.
425+
coercible a b. Coercible a b String JsonCodec a JsonCodec b
426+
coercible name codec =
427+
basicCodec
428+
(bimap (Named name) coerce <<< decode codec)
429+
(coerce (encode codec))

0 commit comments

Comments
 (0)