box-0.9.0: boxes
Safe HaskellSafe-Inferred
LanguageHaskell2010

Box.Emitter

Description

Synopsis

Documentation

newtype Emitter m a Source #

an Emitter emits values of type Maybe a. Source & Producer are also appropriate metaphors.

An Emitter reaches into itself for the value to emit, where itself is an opaque thing from the pov of usage.

>>> e = Emitter (pure (Just "I'm emitted"))
>>> emit e
Just "I'm emitted"
>>> emit mempty
Nothing

Constructors

Emitter 

Fields

Instances

Instances details
FFunctor Emitter Source # 
Instance details

Defined in Box.Emitter

Methods

foist :: (forall x. f x -> g x) -> Emitter f a -> Emitter g a Source #

FoldableM Emitter Source #

This fold completes on the first Nothing emitted, which may not be what you want.

Instance details

Defined in Box.Emitter

Methods

foldrM :: Monad m => (a -> m b -> m b) -> m b -> Emitter m a -> m b Source #

(Monad m, Alternative m) => Alternative (Emitter m) Source # 
Instance details

Defined in Box.Emitter

Methods

empty :: Emitter m a #

(<|>) :: Emitter m a -> Emitter m a -> Emitter m a #

some :: Emitter m a -> Emitter m [a] #

many :: Emitter m a -> Emitter m [a] #

Applicative m => Applicative (Emitter m) Source # 
Instance details

Defined in Box.Emitter

Methods

pure :: a -> Emitter m a #

(<*>) :: Emitter m (a -> b) -> Emitter m a -> Emitter m b #

liftA2 :: (a -> b -> c) -> Emitter m a -> Emitter m b -> Emitter m c #

(*>) :: Emitter m a -> Emitter m b -> Emitter m b #

(<*) :: Emitter m a -> Emitter m b -> Emitter m a #

Functor m => Functor (Emitter m) Source # 
Instance details

Defined in Box.Emitter

Methods

fmap :: (a -> b) -> Emitter m a -> Emitter m b #

(<$) :: a -> Emitter m b -> Emitter m a #

Monad m => Monad (Emitter m) Source # 
Instance details

Defined in Box.Emitter

Methods

(>>=) :: Emitter m a -> (a -> Emitter m b) -> Emitter m b #

(>>) :: Emitter m a -> Emitter m b -> Emitter m b #

return :: a -> Emitter m a #

(Alternative m, Monad m) => MonadPlus (Emitter m) Source # 
Instance details

Defined in Box.Emitter

Methods

mzero :: Emitter m a #

mplus :: Emitter m a -> Emitter m a -> Emitter m a #

(Alternative m, Monad m) => Monoid (Emitter m a) Source # 
Instance details

Defined in Box.Emitter

Methods

mempty :: Emitter m a #

mappend :: Emitter m a -> Emitter m a -> Emitter m a #

mconcat :: [Emitter m a] -> Emitter m a #

(Alternative m, Monad m) => Semigroup (Emitter m a) Source # 
Instance details

Defined in Box.Emitter

Methods

(<>) :: Emitter m a -> Emitter m a -> Emitter m a #

sconcat :: NonEmpty (Emitter m a) -> Emitter m a #

stimes :: Integral b => b -> Emitter m a -> Emitter m a #

type CoEmitter m a = Codensity m (Emitter m a) Source #

An Emitter continuation.

toListM :: Monad m => Emitter m a -> m [a] Source #

Collect emits into a list, and close on the first Nothing.

>>> toListM <$|> qList [1..3]
[1,2,3]

witherE :: Monad m => (a -> m (Maybe b)) -> Emitter m a -> Emitter m b Source #

A monadic Witherable

>>> close $ toListM <$> witherE (\x -> bool (print x >> pure Nothing) (pure (Just x)) (even x)) <$> (qList [1..3])
1
3
[2]

readE :: (Functor m, Read a) => Emitter m Text -> Emitter m (Either Text a) Source #

Read parse Emitter, returning the original text on error

>>> process (toListM . readE) (qList ["1","2","3","four"]) :: IO [Either Text Int]
[Right 1,Right 2,Right 3,Left "four"]

unlistE :: Monad m => Emitter m [a] -> Emitter (StateT [a] m) a Source #

Convert a list emitter to a (Stateful) element emitter.

>>> import Control.Monad.State.Lazy
>>> close $ flip runStateT [] . toListM . unlistE <$> (qList [[0..3],[5..7]])
([0,1,2,3,5,6,7],[])

takeE :: Monad m => Int -> Emitter m a -> Emitter (StateT Int m) a Source #

Take n emits.

>>> import Control.Monad.State.Lazy
>>> close $ flip evalStateT 0 <$> toListM . takeE 4 <$> qList [0..]
[0,1,2,3]

takeUntilE :: Monad m => (a -> Bool) -> Emitter m a -> Emitter m a Source #

Take from an emitter until a predicate.

>>> process (toListM . takeUntilE (==3)) (qList [0..])
[0,1,2]

dropE :: Monad m => Int -> Emitter m a -> CoEmitter m a Source #

Drop n emits.

>>> import Control.Monad.State.Lazy
>>> toListM <$|> (dropE 2 =<< qList [0..3])
[2,3]

pop :: Monad m => Emitter (StateT (Seq a) m) a Source #

Pop from a State sequence.

>>> import qualified Data.Sequence as Seq
>>> import Control.Monad.State.Lazy (evalStateT)
>>> flip evalStateT (Seq.fromList [1..3]) $ toListM pop
[1,2,3]