packages feed

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

{-# LANGUAGE UndecidableInstances #-}

module Pandora.Paradigm.Primary.Transformer.Yoneda where

import Pandora.Pattern.Semigroupoid ((.))
import Pandora.Pattern.Functor.Covariant (Covariant ((<-|-)))
import Pandora.Pattern.Transformer.Liftable (Liftable (lift))
import Pandora.Paradigm.Primary.Algebraic.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)