Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
Emitter
wraps a producer destructor.
"Every Thought emits a Dice Throw" ~ Stéphane Mallarmé
Synopsis
- newtype Emitter m a = Emitter {}
- type CoEmitter m a = Codensity m (Emitter m a)
- toListM :: Monad m => Emitter m a -> m [a]
- witherE :: Monad m => (a -> m (Maybe b)) -> Emitter m a -> Emitter m b
- filterE :: Monad m => (a -> m (Maybe b)) -> Emitter m a -> Emitter m b
- readE :: (Functor m, Read a) => Emitter m Text -> Emitter m (Either Text a)
- unlistE :: Monad m => Emitter m [a] -> Emitter (StateT [a] m) a
- takeE :: Monad m => Int -> Emitter m a -> Emitter (StateT Int m) a
- takeUntilE :: Monad m => (a -> Bool) -> Emitter m a -> Emitter m a
- dropE :: Monad m => Int -> Emitter m a -> CoEmitter m a
- pop :: Monad m => Emitter (StateT (Seq a) m) a
Documentation
An Emitter
emit
s 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
Instances
FFunctor Emitter Source # | |
FoldableM Emitter Source # | This fold completes on the first Nothing emitted, which may not be what you want. |
(Monad m, Alternative m) => Alternative (Emitter m) Source # | |
Applicative m => Applicative (Emitter m) Source # | |
Functor m => Functor (Emitter m) Source # | |
Monad m => Monad (Emitter m) Source # | |
(Alternative m, Monad m) => MonadPlus (Emitter m) Source # | |
(Alternative m, Monad m) => Monoid (Emitter m a) Source # | |
(Alternative m, Monad m) => Semigroup (Emitter m a) Source # | |
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]