@@ -10,7 +10,7 @@ module Data.Codec.Codec
1010 , PartialCodec , cbuild , assume , covered , (<->) , produceMaybe
1111 -- * Codec combinators
1212 , opt , mapCodec , mapCodecF , mapCodecM
13- , mapCodec' , comapCodec' , (=.)
13+ , comapCodec' , (=.)
1414 )
1515where
1616
@@ -20,6 +20,7 @@ import Control.Monad.Reader (ReaderT(..))
2020import Data.Codec.Field
2121import Data.Functor.Compose
2222import Data.Maybe (fromMaybe )
23+ import Data.Profunctor
2324
2425-- | De/serializer for the given types. Usually w ~ r, but they are separate
2526-- to allow for an `Applicative` instance.
@@ -50,9 +51,13 @@ Field c g >-< Codec r w
5051opt :: (Alternative fr , Applicative fw ) => Codec fr fw a -> Codec fr fw (Maybe a )
5152opt (Codec r w) = Codec (optional r) (maybe (pure () ) w)
5253
54+ instance Functor fr => Profunctor (Codec' fr fw ) where
55+ dimap from to (Codec r w)
56+ = Codec (to <$> r) (w . from)
57+
5358-- | Turn a @`Codec` a@ into a @`Codec` b@ by providing an isomorphism.
5459mapCodec :: Functor fr => (a -> b ) -> (b -> a ) -> Codec fr fw a -> Codec fr fw b
55- mapCodec = mapCodec'
60+ mapCodec to from = dimap from to
5661
5762-- | Map a field codec monadically. Useful for error handling but care must be taken to make sure that
5863-- the results are still complementary.
@@ -65,13 +70,6 @@ mapCodecF :: (fr a -> gr a) -> (fw () -> gw ()) -> Codec fr fw a -> Codec gr gw
6570mapCodecF fr fw (Codec r w)
6671 = Codec (fr r) (fw . w)
6772
68- -- | Independently map the two components of a `Codec'`.
69- --
70- -- Generalizes `mapCodec`.
71- mapCodec' :: Functor fr => (a -> b ) -> (c -> d ) -> Codec' fr fw d a -> Codec' fr fw c b
72- mapCodec' to from (Codec r w)
73- = Codec (to <$> r) (w . from)
74-
7573-- | Map on the `produce` component of a `Codec`.
7674--
7775-- @
0 commit comments