module Data.Functor.Extension.Kan (Ran (..), Lan (..)) where

import "morphisms" Control.Morphism ((.), ($))

import Control.Functor.Contravariant (Contravariant ((>$<)))
import Control.Functor.Covariant (Covariant ((<$>)))

data Ran (t :: * -> *) (u :: * -> *) (a :: *) =
        forall b . Ran { ran :: (a -> t b) -> u b }

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

data Lan (t :: * -> *) (u :: * -> *) (a :: *) =
        forall b . Lan { lan :: (t b -> a) -> u b }

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