module Control.Functor.Limit
( Limit, HasLimit(limit)
, Colimit(..)
, liftLimit, liftColimit
) where
import Prelude hiding (abs)
import Control.Functor.Extras
import Data.Monoid
type Limit f = forall a. f a
class HasLimit f where
limit :: f a
instance HasLimit Maybe where
limit = Nothing
instance HasLimit [] where
limit = []
instance Monoid a => HasLimit (Either a) where
limit = (Left mempty)
liftLimit :: (f :~> g) -> Limit f -> Limit g
liftLimit f a = f a
data Colimit f = forall b. Colimit (f b)
liftColimit :: (f :~> g) -> Colimit f -> Colimit g
liftColimit f (Colimit a) = Colimit (f a)