packages feed

category-extras-0.51.0: src/Control/Morphism/Universal.hs

-------------------------------------------------------------------------------------------
-- |
-- Module	: Control.Morphism.Universal
-- Copyright 	: 2008 Edward Kmett
-- License	: BSD3
--
-- Maintainer	: Edward Kmett <ekmett@gmail.com>
-- Stability	: experimental
-- Portability	: portable
--
-- Note the choice of which is universal and which is couniversal is chosen to 
-- make the definitions consistent with limits and colimits.

-------------------------------------------------------------------------------------------

module Control.Morphism.Universal
	( Couniversal(..), extractCouniversal, universalize
	, Universal(..), extractUniversal, couniversalize
	) where

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

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