Copyright | (c) 2014, 2015 Gatlin Johnson <gatlin@niltag.net> |
---|---|
License | GPL-3 |
Maintainer | gatlin@niltag.net |
Stability | experimental |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
This exists primarily for my own education. It is updated often as I try things and is probably, at this moment, wrong.
If you want to know more about iteratees:
http://okmij.org/ftp/Streams.html
My goals were to (1) learn more about iteratees and (2) see how far I could get using free monads.
- newtype TubeF a b k = TubeF {
- runT :: forall r. ((a -> k) -> r) -> ((b, k) -> r) -> r
- type Tube a b m r = FreeT (TubeF a b) m r
- type Source b m r = forall x. Tube x b m r
- type Sink a m r = forall x. Tube a x m r
- type Action m r = forall x. Tube x x m r
- lift :: MonadTrans t => forall m a. Monad m => m a -> t m a
- runFreeT :: FreeT f m a -> m (FreeF f a (FreeT f m a))
- await :: Monad m => Tube a b m a
- yield :: Monad m => b -> Tube a b m ()
- awaitF :: (a -> k) -> TubeF a b k
- yieldF :: b -> k -> TubeF a b k
- each :: (Monad m, Foldable t) => t b -> Tube a b m ()
- for :: Monad m => Tube a b m r -> (b -> Tube a c m s) -> Tube a c m r
- (~>) :: Monad m => Tube a b m r -> (b -> Tube a c m s) -> Tube a c m r
- (>-) :: Monad m => Tube a b m r -> (b -> Tube b c m r) -> Tube a c m r
- (><) :: Monad m => Tube a b m r -> Tube b c m r -> Tube a c m r
- run :: FreeT f m a -> m (FreeF f a (FreeT f m a))
- liftT :: (MonadTrans t, Monad m) => FreeT f m a -> t m (FreeF f a (FreeT f m a))
- cat :: Monad m => Tube a a m r
- map :: Monad m => (a -> b) -> Tube a b m r
- drop :: Monad m => Int -> Tube a a m r
- take :: Monad m => Int -> Tube a a m ()
- takeWhile :: Monad m => (a -> Bool) -> Tube a a m ()
- filter :: Monad m => (a -> Bool) -> Tube a a m r
- reduce :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Source a m () -> m b
- every :: (Foldable t, Monad m) => t b -> Tube a (Maybe b) m ()
- unyield :: Monad m => Source b m () -> m (Maybe b)
- prompt :: Source String IO ()
- display :: Sink String IO ()
Documentation
TubeF
is the union of unary functions and binary products into a single
type, here defined with a Boehm-Berarducci encoding.
Rather than using a normal ADT, which would certainly make the code a bit easier to read and write, a value of this type is actually a control flow mechanism accepting two continuations and choosing one or the other.
Client code should never actually have to deal with this.
Re-exports
lift :: MonadTrans t => forall m a. Monad m => m a -> t m a
Lift a computation from the argument monad to the constructed monad.
Core infrastructure
(>-) :: Monad m => Tube a b m r -> (b -> Tube b c m r) -> Tube a c m r Source
Connect a task to a continuation yielding another task; see ><
(><) :: Monad m => Tube a b m r -> Tube b c m r -> Tube a c m r infixl 3 Source
Compose two tasks in a pull-based stream
Utilities
map :: Monad m => (a -> b) -> Tube a b m r Source
Transforms all incoming values according to some function.
takeWhile :: Monad m => (a -> Bool) -> Tube a a m () Source
Terminates the stream upon receiving a value violating the predicate
filter :: Monad m => (a -> Bool) -> Tube a a m r Source
Yields only values satisfying some predicate.
:: Monad m | |
=> (x -> a -> x) | step function |
-> x | initial value |
-> (x -> b) | final transformation |
-> Source a m () | stream source |
-> m b |
Strict left-fold of a stream
every :: (Foldable t, Monad m) => t b -> Tube a (Maybe b) m () Source
Similar to each
except it explicitly marks the stream as exhausted