module Control.Comonad.Density
( Density(..)
, liftDensity
, densityToAdjunction, adjunctionToDensity
) where
import Control.Comonad
import Control.Comonad.Trans.Class
import Data.Functor.Adjunction
data Density k a where
Density :: (k b -> a) -> k b -> Density k a
instance Functor (Density f) where
fmap f (Density g h) = Density (f . g) h
instance Extend (Density f) where
duplicate (Density f ws) = Density (Density f) ws
instance Comonad (Density f) where
extract (Density f a) = f a
instance ComonadTrans Density where
lower (Density f c) = extend f c
liftDensity :: Comonad w => w a -> Density w a
liftDensity = Density extract
densityToAdjunction :: Adjunction f g => Density f a -> f (g a)
densityToAdjunction (Density f v) = fmap (leftAdjunct f) v
adjunctionToDensity :: Adjunction f g => f (g a) -> Density f a
adjunctionToDensity = Density counit