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