box-0.9.3.1: A profunctor effect system.
Safe HaskellSafe-Inferred
LanguageGHC2021

Box.Emitter

Description

Emitter wraps a producer destructor.

"Every Thought emits a Dice Throw" ~ Stéphane Mallarmé

Synopsis

Documentation

newtype Emitter m a Source #

An Emitter emits values of type Maybe a. Source and producer are similar 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

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

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

Like witherE but does not emit Nothing on filtering.

>>> toListM <$|> filterE (\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

>>> (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
>>> 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
>>> 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.

>>> (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]