@hackage streaming0.1.0.12

A free monad transformer optimized for streaming applications.

Stream can be used wherever FreeT is used. The compiler's standard range of optimizations work better for operations written in terms of Stream. FreeT f m r / Stream f m r is of course extremely general, and many functor-general combinators are exported by the general module Streaming.

See the examples in Streaming.Prelude for a sense of how simple the library is to use and think about. That module is focused on employment with such base functors (readings of the f in Stream f m r) that express different forms of effectful sequences. Some of these appear elsewhere under titles like

pipes:      Producer a m r, Producer a m (Producer a m r), FreeT (Producer a m) m r
io-streams: InputStream a, Generator a r
conduit:    Source m a, ConduitM () o m r

and the like. Streaming.Prelude closely follows Pipes.Prelude, but cleverly omits the pipes.

Interoperation with pipes is accomplished with this isomorphism:

Pipes.unfoldr Streaming.next        :: Stream (Of a) m r   -> Producer a m r
Streaming.unfoldr Pipes.next        :: Producer a m r      -> Stream (Of a) m r

Interoperation with io-streams is thus:

Streaming.reread IOStreams.read     :: InputStream a       -> Stream (Of a) IO ()
IOStreams.unfoldM Streaming.uncons  :: Stream (Of a) IO () -> IO (InputStream a)

A simple exit to conduit would be, e.g.:

Conduit.unfoldM Streaming.uncons    :: Stream (Of a) m ()  -> Source m a

These conversions should never be more expensive than a single >-> or =$=.

With a much more general level, we also of course have interopetion with free:

Free.iterTM Stream.wrap :: FreeT f m a -> Stream f m a Stream.iterTM Free.wrap :: Stream f m a -> FreeT f m a

See the companion package streaming-bytestring For some simple examples, see these replicas of shell-like programs from the io-streams tutorial.