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