module Control.Morphism.Universal
( Couniversal(..), extractCouniversal, couniversalize
, couniversalIdentity
, Universal(..), extractUniversal, universalize
, universalIdentity
) where
import Control.Monad.Identity
data Couniversal a f x = Couniversal (a -> f x) (forall z. (a -> f z) -> x -> z)
extractCouniversal :: Couniversal a f x -> a -> f x
extractCouniversal (Couniversal f _) = f
couniversalize :: (a -> f z) -> Couniversal a f x -> x -> z
couniversalize f (Couniversal _ s) = s f
couniversalIdentity :: Couniversal a Identity a
couniversalIdentity = Couniversal Identity (runIdentity .)
data Universal a f x = Universal (f x -> a) (forall z. (f z -> a) -> z -> x)
extractUniversal :: Universal a f x -> f x -> a
extractUniversal (Universal f _) = f
universalize :: Universal a f x -> (f z -> a) -> z -> x
universalize (Universal _ s) f = s f
universalIdentity :: Universal a Identity a
universalIdentity = Universal runIdentity (. Identity)