packages feed

pandora-0.5.6: Pandora/Paradigm/Primary/Transformer/Yoneda.hs

{-# LANGUAGE UndecidableInstances #-}

module Pandora.Paradigm.Primary.Transformer.Yoneda where

import Pandora.Pattern.Semigroupoid ((.))
import Pandora.Pattern.Category ((<--))
import Pandora.Pattern.Functor.Covariant (Covariant ((<-|-)))
import Pandora.Pattern.Transformation.Liftable (Liftable (lift))
import Pandora.Pattern.Operation.Exponential ()

newtype Yoneda t a = Yoneda
	{ yoneda :: forall b . (a -> b) -> t b }

instance Covariant (->) (->) (Yoneda t) where
	f <-|- x = Yoneda (\k -> yoneda x <-- k . f)

instance Liftable (->) Yoneda where
	lift x = Yoneda (<-|- x)