packages feed

pandora-0.1.0: Pandora/Paradigm/Basis/Junction/Kan.hs

module Pandora.Paradigm.Basis.Junction.Kan (Lan (..), Ran (..)) where

import Pandora.Core.Morphism ((.), ($))
import Pandora.Pattern.Functor.Contravariant (Contravariant ((>$<)))
import Pandora.Pattern.Functor.Covariant (Covariant ((<$>)))

newtype Lan (t :: * -> *) (u :: * -> *) (b :: *) (a :: *) =
	Lan { lan :: (t b -> a) -> u b }

instance Contravariant (Lan t u b) where
	f >$< Lan x = Lan $ x . (f .)

newtype Ran (t :: * -> *) (u :: * -> *) (b :: *) (a :: *) =
	Ran { ran :: (a -> t b) -> u b }

instance Covariant (Ran t u b) where
	f <$> Ran x = Ran $ x . (. f)