streaming-eversion-0.2.0.0: Translate pull-based stream folds into push-based iteratees.

Safe HaskellSafe
LanguageHaskell98

Streaming.Eversion.Pipes

Contents

Description

Like Streaming.Eversion, but for Producer folds and transformations.

Synopsis

Producer folds

pipeEversible Source #

Arguments

:: (forall m r. Monad m => Producer a m r -> m (x, r)) 
-> Eversible a x 

evert :: Eversible a x -> Fold a x Source #

pipeEversibleM Source #

Arguments

:: (forall t r. (MonadTrans t, Monad (t m)) => Producer a (t m) r -> t m (x, r)) 
-> EversibleM m a x 

pipeEversibleM_ Source #

Arguments

:: (forall t r. (MonadTrans t, Monad (t m)) => Producer a (t m) r -> t m r) 
-> EversibleM m a () 

evertM :: Monad m => EversibleM m a x -> FoldM m a x Source #

pipeEversibleMIO Source #

Arguments

:: (forall t r. (MonadTrans t, MonadIO (t m)) => Producer a (t m) r -> t m (x, r)) 
-> EversibleMIO m a x 

pipeEversibleMIO_ Source #

Arguments

:: (forall t r. (MonadTrans t, MonadIO (t m)) => Producer a (t m) r -> t m r) 
-> EversibleMIO m a () 

evertMIO :: MonadIO m => EversibleMIO m a x -> FoldM m a x Source #

Producer transformations

pipeTransvertible Source #

Arguments

:: (forall m r. Monad m => Producer a m r -> Producer b m r) 
-> Transvertible a b 

transvert :: Transvertible b a -> forall x. Fold a x -> Fold b x Source #

pipeTransvertibleM Source #

Arguments

:: (forall t r. (MonadTrans t, Monad (t m)) => Producer a (t m) r -> Producer b (t m) r) 
-> TransvertibleM m a b 

transvertM :: Monad m => TransvertibleM m b a -> forall x. FoldM m a x -> FoldM m b x Source #

pipeTransvertibleMIO Source #

Arguments

:: (forall t r. (MonadTrans t, MonadIO (t m)) => Producer a (t m) r -> Producer b (t m) r) 
-> TransvertibleMIO m a b 

transvertMIO Source #

Arguments

:: MonadIO m 
=> TransvertibleMIO m b a 
-> forall x. FoldM m a x -> FoldM m b x 

Examples

Creating a TransvertibleM out a decoder from Pipes.Text.Encoding. In case the decoding fails, part of the leftovers are read in order to build the error value.

>>> :{
    let trans = transvertM (pipeTransvertibleM (\producer -> do result <- PT.decode (PT.utf8 . PT.eof) producer 
                                                                lift (case result of
                                                                        Left ls -> sample ls >>= lift . throwE
                                                                        Right r -> return r)))
        sample leftovers = L.purely P.fold L.mconcat (void (view (PB.splitAt 5) leftovers))
    in  runExceptT $ L.foldM (trans (L.generalize L.mconcat)) ["decode","this"]
    :}
Right "decodethis"
>>> :{
    let trans = transvertM (pipeTransvertibleM (\producer -> do result <- PT.decode (PT.utf8 . PT.eof) producer 
                                                                lift (case result of
                                                                        Left ls -> sample ls >>= lift . throwE
                                                                        Right r -> return r)))
        sample leftovers = L.purely P.fold L.mconcat (void (view (PB.splitAt 8) leftovers))
    in  runExceptT $ L.foldM (trans (L.generalize L.mconcat)) ["invalid \xc3\x28","sequence"]
    :}
Left "\195(sequen"

Note that the errors are thrown in an ExceptT layer below the Producer and the polymorphic transformer.