module Data.Profunctor.Composition
( Procompose(..)
, proidl
, proidr
, coproidl
, coproidr
) where
import Data.Profunctor
data Procompose f g d c where
Procompose :: f d a -> g a c -> Procompose f g d c
instance (Profunctor f, Profunctor g) => Profunctor (Procompose f g) where
lmap k (Procompose f g) = Procompose (lmap k f) g
rmap k (Procompose f g) = Procompose f (rmap k g)
instance Profunctor g => Functor (Procompose f g a) where
fmap k (Procompose f g) = Procompose f (rmap k g)
proidl :: Profunctor g => Procompose (->) g d c -> g d c
proidl (Procompose f g) = lmap f g
proidr :: Profunctor f => Procompose f (->) d c -> f d c
proidr (Procompose f g) = rmap g f
coproidl :: g d c -> Procompose (->) g d c
coproidl = Procompose id
coproidr :: f d c -> Procompose f (->) d c
coproidr g = Procompose g id