@hackage streaming0.1.0.5

A free monad transformer optimized for streaming applications.

Stream can be used wherever FreeT is used. The compiler is better able to optimize operations written in terms of Stream.

See the examples in Streaming.Prelude for a sense of how simple the library is to use and think about. Streaming.Prelude closely follows Pipes.Prelude, but cleverly omits the pipes. It is focused on employment with a base functors which generate effectful sequences: i.e., things like

  • Pipes.Producer
  • Conduit.Source
  • IOStreams.InputStream
  • IOStreams.Generator

Interoperation with pipes is accomplished with this isomorphism which uses Pipes.Prelude.unfoldr from HEAD:

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

(If you don't have pipes-HEAD, inline the definition of unfoldr.)

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)

for example. 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 =$=.