fusion-0.2.0: Effectful streaming library based on shortcut fusion techniques

Safe HaskellNone
LanguageHaskell2010

Fusion

Contents

Synopsis

Step

data Step s a r Source

A simple stepper, as suggested by Duncan Coutts in his Thesis paper, "Stream Fusion: Practical shortcut fusion for coinductive sequence types". This version adds a result type.

Constructors

Done r 
Skip s 
Yield s a 

Instances

Functor (Step s a) 

StepList

newtype StepList s r a Source

Constructors

StepList 

Fields

getStepList :: Step s a r
 

Instances

Stream

data Stream a m r Source

Constructors

forall s . Stream (s -> m (Step s a r)) s 

Instances

map :: Functor m => (a -> b) -> Stream a m r -> Stream b m r Source

Map over the values produced by a stream.

>>> map (+1) (fromList [1..3]) :: Stream Int Identity ()
Stream [2,3,4]

filter :: Functor m => (a -> Bool) -> Stream a m r -> Stream a m r Source

drop :: Applicative m => Int -> Stream a m r -> Stream a m () Source

concat :: Monad m => Stream (Stream a m r) m r -> Stream a m r Source

fromList :: (Foldable f, Applicative m) => f a -> Stream a m () Source

fromListM :: (Applicative m, Foldable f) => m (f a) -> Stream a m () Source

runStream :: Monad m => Stream a m r -> m r Source

runStream' :: Monad m => Stream Void m r -> m r Source

bindStream :: Monad m => (forall s. Step s a r -> m r) -> Stream a m r -> m r Source

Helper function for more easily writing step functions. Be aware that this can degrade performance over writing the step function directly as an inlined, inner function. The same applies for applyStream, stepStream, foldlStream, etc.

applyStream :: Functor m => (forall s. Step s a r -> r) -> Stream a m r -> m r Source

stepStream :: Functor m => (forall s. Step s a r -> Step s b r) -> Stream a m r -> Stream b m r Source

foldlStream :: Monad m => (b -> a -> b) -> (b -> r -> s) -> b -> Stream a m r -> m s Source

foldlStreamM :: Monad m => (m b -> a -> m b) -> (m b -> r -> m s) -> m b -> Stream a m r -> m s Source

foldrStream :: Monad m => (a -> b -> b) -> (r -> b) -> Stream a m r -> m b Source

foldrStreamM :: Monad m => (a -> m b -> m b) -> (r -> m b) -> Stream a m r -> m b Source

lazyFoldrStreamIO :: (a -> IO b -> IO b) -> (r -> IO b) -> Stream a IO r -> IO b Source

toList :: Monad m => Stream a m r -> m [a] Source

bracket :: (Monad m, MonadMask (Base m), MonadSafe m) => Base m s -> (s -> Base m ()) -> (forall r. s -> (s -> a -> m r) -> (s -> m r) -> m r -> m r) -> Stream a m () Source

next :: Monad m => Stream a m r -> m (Either r (a, Stream a m r)) Source

StreamList

newtype ListT m a Source

Constructors

ListT 

Fields

getListT :: Stream a m ()
 

Instances

concatL :: (Monad m, Applicative m) => ListT m (ListT m a) -> ListT m a Source

Pipes

type Producer b m r = Stream b m r Source

type Pipe a b m r = Stream a m () -> Stream b m r Source

type Consumer a m r = Stream a m () -> m r Source

each :: (Applicative m, Foldable f) => f a -> Producer a m () Source

(>->) :: Stream a m r -> (Stream a m r -> Stream b m r) -> Stream b m r Source