free-5.2: Monads for free
Copyright(C) 2008-2013 Edward Kmett
LicenseBSD-style (see the file LICENSE)
MaintainerEdward Kmett <ekmett@gmail.com>
Stabilityprovisional
PortabilityMPTCs, fundeps
Safe HaskellSafe
LanguageHaskell2010

Control.Comonad.Trans.Coiter

Description

The coiterative comonad generated by a comonad

Synopsis

Documentation

Coiterative comonads represent non-terminating, productive computations.

They are the dual notion of iterative monads. While iterative computations produce no values or eventually terminate with one, coiterative computations constantly produce values and they never terminate.

It's simpler form, Coiter, is an infinite stream of data. CoiterT extends this so that each step of the computation can be performed in a comonadic context.

The coiterative comonad transformer

newtype CoiterT (w :: Type -> Type) a Source #

This is the coiterative comonad generated by a comonad

Constructors

CoiterT 

Fields

Instances

Instances details
ComonadHoist CoiterT Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

cohoist :: (Comonad w, Comonad v) => (forall x. w x -> v x) -> CoiterT w a -> CoiterT v a #

ComonadTrans CoiterT Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

lower :: Comonad w => CoiterT w a -> w a #

ComonadEnv e w => ComonadEnv e (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

ask :: CoiterT w a -> e #

ComonadStore s w => ComonadStore s (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

pos :: CoiterT w a -> s #

peek :: s -> CoiterT w a -> a #

peeks :: (s -> s) -> CoiterT w a -> a #

seek :: s -> CoiterT w a -> CoiterT w a #

seeks :: (s -> s) -> CoiterT w a -> CoiterT w a #

experiment :: Functor f => (s -> f s) -> CoiterT w a -> f a #

ComonadTraced m w => ComonadTraced m (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

trace :: m -> CoiterT w a -> a #

Comonad w => ComonadCofree Identity (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

unwrap :: CoiterT w a -> Identity (CoiterT w a) Source #

Foldable w => Foldable (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

fold :: Monoid m => CoiterT w m -> m #

foldMap :: Monoid m => (a -> m) -> CoiterT w a -> m #

foldMap' :: Monoid m => (a -> m) -> CoiterT w a -> m #

foldr :: (a -> b -> b) -> b -> CoiterT w a -> b #

foldr' :: (a -> b -> b) -> b -> CoiterT w a -> b #

foldl :: (b -> a -> b) -> b -> CoiterT w a -> b #

foldl' :: (b -> a -> b) -> b -> CoiterT w a -> b #

foldr1 :: (a -> a -> a) -> CoiterT w a -> a #

foldl1 :: (a -> a -> a) -> CoiterT w a -> a #

toList :: CoiterT w a -> [a] #

null :: CoiterT w a -> Bool #

length :: CoiterT w a -> Int #

elem :: Eq a => a -> CoiterT w a -> Bool #

maximum :: Ord a => CoiterT w a -> a #

minimum :: Ord a => CoiterT w a -> a #

sum :: Num a => CoiterT w a -> a #

product :: Num a => CoiterT w a -> a #

Eq1 w => Eq1 (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

liftEq :: (a -> b -> Bool) -> CoiterT w a -> CoiterT w b -> Bool #

Ord1 w => Ord1 (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

liftCompare :: (a -> b -> Ordering) -> CoiterT w a -> CoiterT w b -> Ordering #

Read1 w => Read1 (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (CoiterT w a) #

liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [CoiterT w a] #

liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec (CoiterT w a) #

liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [CoiterT w a] #

Show1 w => Show1 (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> CoiterT w a -> ShowS #

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [CoiterT w a] -> ShowS #

Traversable w => Traversable (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

traverse :: Applicative f => (a -> f b) -> CoiterT w a -> f (CoiterT w b) #

sequenceA :: Applicative f => CoiterT w (f a) -> f (CoiterT w a) #

mapM :: Monad m => (a -> m b) -> CoiterT w a -> m (CoiterT w b) #

sequence :: Monad m => CoiterT w (m a) -> m (CoiterT w a) #

Functor w => Functor (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

fmap :: (a -> b) -> CoiterT w a -> CoiterT w b #

(<$) :: a -> CoiterT w b -> CoiterT w a #

Comonad w => Comonad (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

extract :: CoiterT w a -> a #

duplicate :: CoiterT w a -> CoiterT w (CoiterT w a) #

extend :: (CoiterT w a -> b) -> CoiterT w a -> CoiterT w b #

(Typeable w, Data (w (a, CoiterT w a)), Data a) => Data (CoiterT w a) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> CoiterT w a -> c (CoiterT w a) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (CoiterT w a) #

toConstr :: CoiterT w a -> Constr #

dataTypeOf :: CoiterT w a -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (CoiterT w a)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (CoiterT w a)) #

gmapT :: (forall b. Data b => b -> b) -> CoiterT w a -> CoiterT w a #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> CoiterT w a -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> CoiterT w a -> r #

gmapQ :: (forall d. Data d => d -> u) -> CoiterT w a -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> CoiterT w a -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> CoiterT w a -> m (CoiterT w a) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> CoiterT w a -> m (CoiterT w a) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> CoiterT w a -> m (CoiterT w a) #

(Read1 w, Read a) => Read (CoiterT w a) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

(Show1 w, Show a) => Show (CoiterT w a) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

showsPrec :: Int -> CoiterT w a -> ShowS #

show :: CoiterT w a -> String #

showList :: [CoiterT w a] -> ShowS #

(Eq1 w, Eq a) => Eq (CoiterT w a) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

(==) :: CoiterT w a -> CoiterT w a -> Bool #

(/=) :: CoiterT w a -> CoiterT w a -> Bool #

(Ord1 w, Ord a) => Ord (CoiterT w a) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

compare :: CoiterT w a -> CoiterT w a -> Ordering #

(<) :: CoiterT w a -> CoiterT w a -> Bool #

(<=) :: CoiterT w a -> CoiterT w a -> Bool #

(>) :: CoiterT w a -> CoiterT w a -> Bool #

(>=) :: CoiterT w a -> CoiterT w a -> Bool #

max :: CoiterT w a -> CoiterT w a -> CoiterT w a #

min :: CoiterT w a -> CoiterT w a -> CoiterT w a #

The coiterative comonad

type Coiter = CoiterT Identity Source #

The coiterative comonad

coiter :: a -> Coiter a -> Coiter a Source #

Prepends a result to a coiterative computation.

runCoiter . uncurry coiter == id

runCoiter :: Coiter a -> (a, Coiter a) Source #

Extracts the first result from a coiterative computation.

uncurry coiter . runCoiter == id

Generating coiterative comonads

unfold :: Comonad w => (w a -> a) -> w a -> CoiterT w a Source #

Unfold a CoiterT comonad transformer from a cokleisli arrow and an initial comonadic seed.

Cofree comonads

class (Functor f, Comonad w) => ComonadCofree (f :: Type -> Type) (w :: Type -> Type) | w -> f where Source #

Allows you to peel a layer off a cofree comonad.

Methods

unwrap :: w a -> f (w a) Source #

Remove a layer.

Instances

Instances details
ComonadCofree Maybe NonEmpty Source # 
Instance details

Defined in Control.Comonad.Cofree.Class

Methods

unwrap :: NonEmpty a -> Maybe (NonEmpty a) Source #

ComonadCofree [] Tree Source # 
Instance details

Defined in Control.Comonad.Cofree.Class

Methods

unwrap :: Tree a -> [Tree a] Source #

Comonad w => ComonadCofree Identity (CoiterT w) Source # 
Instance details

Defined in Control.Comonad.Trans.Coiter

Methods

unwrap :: CoiterT w a -> Identity (CoiterT w a) Source #

Functor f => ComonadCofree f (Cofree f) Source # 
Instance details

Defined in Control.Comonad.Cofree

Methods

unwrap :: Cofree f a -> f (Cofree f a) Source #

ComonadCofree f w => ComonadCofree f (EnvT e w) Source # 
Instance details

Defined in Control.Comonad.Cofree.Class

Methods

unwrap :: EnvT e w a -> f (EnvT e w a) Source #

ComonadCofree f w => ComonadCofree f (StoreT s w) Source # 
Instance details

Defined in Control.Comonad.Cofree.Class

Methods

unwrap :: StoreT s w a -> f (StoreT s w a) Source #

(ComonadCofree f w, Monoid m) => ComonadCofree f (TracedT m w) Source # 
Instance details

Defined in Control.Comonad.Cofree.Class

Methods

unwrap :: TracedT m w a -> f (TracedT m w a) Source #

(Functor f, Comonad w) => ComonadCofree f (CofreeT f w) Source # 
Instance details

Defined in Control.Comonad.Trans.Cofree

Methods

unwrap :: CofreeT f w a -> f (CofreeT f w a) Source #

ComonadCofree f w => ComonadCofree f (IdentityT w) Source # 
Instance details

Defined in Control.Comonad.Cofree.Class

Methods

unwrap :: IdentityT w a -> f (IdentityT w a) Source #

ComonadCofree (Const b :: Type -> Type) ((,) b) Source # 
Instance details

Defined in Control.Comonad.Cofree.Class

Methods

unwrap :: (b, a) -> Const b (b, a) Source #

Examples