#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702
#endif
module Data.Functor.Contravariant.Coyoneda
( Coyoneda(..)
, liftCoyoneda
, lowerCoyoneda
) where
import Control.Arrow
import Data.Functor.Contravariant
import Data.Functor.Contravariant.Adjunction
import Data.Functor.Contravariant.Representable
type instance Value (Coyoneda f) = Value f
data Coyoneda f a where
Coyoneda :: (a -> b) -> f b -> Coyoneda f a
instance Contravariant (Coyoneda f) where
contramap f (Coyoneda g m) = Coyoneda (g.f) m
instance Valued f => Valued (Coyoneda f) where
contramapWithValue beav (Coyoneda ac fc) = Coyoneda (left ac . beav) (contramapWithValue id fc)
instance Coindexed f => Coindexed (Coyoneda f) where
coindex (Coyoneda ab fb) a = coindex fb (ab a)
instance Representable f => Representable (Coyoneda f) where
contrarep = liftCoyoneda . contrarep
instance Adjunction f g => Adjunction (Coyoneda f) (Coyoneda g) where
leftAdjunct f = liftCoyoneda . leftAdjunct (lowerCoyoneda . f)
rightAdjunct f = liftCoyoneda . rightAdjunct (lowerCoyoneda . f)
liftCoyoneda :: f a -> Coyoneda f a
liftCoyoneda = Coyoneda id
lowerCoyoneda :: Contravariant f => Coyoneda f a -> f a
lowerCoyoneda (Coyoneda f m) = contramap f m