module MHask.Indexed.Comonad where
import MHask.Arrow
import qualified MHask.Indexed.Functor as MHask
import qualified MHask.Indexed.Copointed as MHask
class (MHask.IxCopointed t) => IxComonad t where
iduplicate :: (Monad m)
=> t i j (t j k m) <~ t i k m
default iduplicate :: (Monad m, Monad (t j k m))
=> t i j (t j k m) <~ t i k m
iduplicate = iextend id
iextend :: (Monad m, Monad n)
=> (m <~ t j k n) -> (t i j m <~ t i k n)
default iextend ::
(Monad m, Monad n,
Monad (t i j m), Monad (t j k n), Monad (t i k n),
Monad (t i j (t j k n)))
=> (m <~ t j k n) -> (t i j m <~ t i k n)
iextend f = MHask.imap f ~<~ iduplicate
imapComonad :: (Monad m, Monad n, Monad (t j j n), IxComonad t)
=> (m <~ n) -> (t i j m <~ t i j n)
imapComonad f = iextend (f ~<~ MHask.iextract)