module Control.Functor.Covariant.Composition.Comonad (Comonad (..)) where

import Control.Functor.Covariant.Extractable (Extractable)
import Control.Functor.Covariant.Composition.Extendable (Extendable)

{- |
> Let f :: (Pointable t, Bindable t) => t a -> b
> Let g :: (Pointable t, Bindable t) => t a -> b

> When using this constraint, you should ensure it satisfies the three laws:
> * Left identity: extend extract ≡ identity
> * Right identity: extract . extend f ≡ f
> * Associativity: extend f . extend g ≡ extend (f . extend g)
-}

type Comonad t = (Extractable t, Extendable t)