Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
Various ways to connect things up.
Synopsis
- qList :: [a] -> CoEmitter IO a
- qListWith :: Queue a -> [a] -> CoEmitter IO a
- popList :: Monad m => [a] -> Committer m a -> m ()
- pushList :: Monad m => Emitter m a -> m [a]
- pushListN :: Monad m => Int -> Emitter m a -> m [a]
- sink :: Int -> (a -> IO ()) -> CoCommitter IO a
- sinkWith :: Queue a -> Int -> (a -> IO ()) -> CoCommitter IO a
- source :: Int -> IO a -> CoEmitter IO a
- sourceWith :: Queue a -> Int -> IO a -> CoEmitter IO a
- forkEmit :: Monad m => Emitter m a -> Committer m a -> Emitter m a
- bufferCommitter :: Committer IO a -> CoCommitter IO a
- bufferEmitter :: Emitter IO a -> CoEmitter IO a
- concurrentE :: Queue a -> Emitter IO a -> Emitter IO a -> CoEmitter IO a
- concurrentC :: Queue a -> Committer IO a -> Committer IO a -> CoCommitter IO a
- takeQ :: Queue a -> Int -> Emitter IO a -> CoEmitter IO a
- evalEmitter :: s -> Emitter (StateT s IO) a -> CoEmitter IO a
- evalEmitterWith :: Queue a -> s -> Emitter (StateT s IO) a -> CoEmitter IO a
Documentation
qList :: [a] -> CoEmitter IO a Source #
Queue a list Unbounded
.
>>>
pushList <$|> qList [1,2,3]
[1,2,3]
qListWith :: Queue a -> [a] -> CoEmitter IO a Source #
Queue a list with an explicit Queue
.
>>>
pushList <$|> qListWith Single [1,2,3]
[1,2,3]
popList :: Monad m => [a] -> Committer m a -> m () Source #
Directly supply a list to a committer action, via pop.
>>>
popList [1..3] showStdout
1 2 3
pushList :: Monad m => Emitter m a -> m [a] Source #
Push an Emitter into a list, via push.
>>>
pushList <$|> qList [1..3]
[1,2,3]
pushListN :: Monad m => Int -> Emitter m a -> m [a] Source #
Push an Emitter into a list, finitely.
>>>
pushListN 2 <$|> qList [1..3]
[1,2]
sink :: Int -> (a -> IO ()) -> CoCommitter IO a Source #
Create a finite Committer Unbounded Queue.
>>>
glue <$> sink 2 print <*|> qList [1..3]
1 2
sinkWith :: Queue a -> Int -> (a -> IO ()) -> CoCommitter IO a Source #
Create a finite Committer Queue.
source :: Int -> IO a -> CoEmitter IO a Source #
Create a finite (Co)Emitter Unbounded Queue.
>>>
glue toStdout <$|> source 2 (pure "hi")
hi hi
sourceWith :: Queue a -> Int -> IO a -> CoEmitter IO a Source #
Create a finite (Co)Emitter Unbounded Queue.
>>>
glue toStdout <$|> sourceWith Single 2 (pure "hi")
hi hi
forkEmit :: Monad m => Emitter m a -> Committer m a -> Emitter m a Source #
Glues an emitter to a committer, then resupplies the emitter.
>>>
(c1,l1) <- refCommitter :: IO (Committer IO Int, IO [Int])
>>>
close $ toListM <$> (forkEmit <$> (qList [1..3]) <*> pure c1)
[1,2,3]
>>>
l1
[1,2,3]
bufferCommitter :: Committer IO a -> CoCommitter IO a Source #
Buffer a committer.
concurrentE :: Queue a -> Emitter IO a -> Emitter IO a -> CoEmitter IO a Source #
Concurrently run two emitters.
This differs to (<>), which is left-biased.
Note that functions such as toListM, which complete on the first Nothing emitted, will not work as expected.
>>>
close $ (fmap toListM) (join $ concurrentE Single <$> qList [1..3] <*> qList [5..9])
[1,2,3]
In the code below, the ordering is non-deterministic.
(c,l) <- refCommitter :: IO (Committer IO Int, IO [Int]) close $ glue c <$> (join $ concurrentE Single <$> qList [1..30] <*> qList [40..60])
concurrentC :: Queue a -> Committer IO a -> Committer IO a -> CoCommitter IO a Source #
Concurrently run two committers.
>>>
import Data.Functor.Contravariant
>>>
import Data.Text (pack)
>>>
cFast = witherC (\b -> pure (Just b)) . contramap ("fast: " <>) $ toStdout
>>>
cSlow = witherC (\b -> sleep 0.1 >> pure (Just b)) . contramap ("slow: " <>) $ toStdout
>>>
close $ (popList ((pack . show) <$> [1..3]) <$> (concurrentC Unbounded cFast cSlow)) <> pure (sleep 1)
fast: 1 fast: 2 fast: 3 slow: 1 slow: 2 slow: 3
takeQ :: Queue a -> Int -> Emitter IO a -> CoEmitter IO a Source #
Take and queue n emits.
>>>
import Control.Monad.State.Lazy
>>>
toListM <$|> (takeQ Single 4 =<< qList [0..])
[0,1,2,3]