Skip to content

Commit 3d69d5e

Browse files
committed
Add Profunctor instance.
1 parent b7690b6 commit 3d69d5e

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

Data/Codec/Codec.hs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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
)
1515
where
1616

@@ -20,6 +20,7 @@ import Control.Monad.Reader (ReaderT(..))
2020
import Data.Codec.Field
2121
import Data.Functor.Compose
2222
import 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
5051
opt :: (Alternative fr, Applicative fw) => Codec fr fw a -> Codec fr fw (Maybe a)
5152
opt (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.
5459
mapCodec :: 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
6570
mapCodecF 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
-- @

codec.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ library
116116
text >= 1.2.0.4,
117117
unordered-containers >= 0.2.5.1,
118118
data-default-class >= 0.0.1,
119-
transformers >= 0.4.2.0
119+
transformers >= 0.4.2.0,
120+
profunctors
120121
-- hs-source-dirs:
121122
default-language: Haskell2010
122123
ghc-options: -Wall -fno-warn-orphans

0 commit comments

Comments
 (0)