streaming: 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:
>>>
S.stdoutLn $ S.take 2 S.stdinLn
let's<Enter> let's stream<Enter> stream
And here we do a little connect and resume, as the streaming-io experts call it:
>>>
rest <- S.print $ S.splitAt 3 $ S.each [1..10]
1 2 3>>>
S.sum rest
49
Somehow, we didn't even need a four-character operator for that, nor advice about best practices; just ordinary Haskell common sense.
The simplest form of 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 =$=
.
At a much more general level, we also of course have interoperation 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
For some simple ghci examples, see the commentary throughout the Prelude module. For slightly more advanced usage see the commentary in the haddocks of streaming-bytestring and e.g. these replicas of shell-like programs from the io-streams tutorial. Here's a simple streaming GET request with intrinsically streaming byte streams.
Downloads
- streaming-0.1.0.14.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
Versions [RSS] | 0.1.0.0, 0.1.0.1, 0.1.0.3, 0.1.0.4, 0.1.0.5, 0.1.0.6, 0.1.0.7, 0.1.0.8, 0.1.0.9, 0.1.0.10, 0.1.0.11, 0.1.0.12, 0.1.0.13, 0.1.0.14, 0.1.0.15, 0.1.0.16, 0.1.0.17, 0.1.0.18, 0.1.0.19, 0.1.0.20, 0.1.1.0, 0.1.1.1, 0.1.2.0, 0.1.2.2, 0.1.3.0, 0.1.3.1, 0.1.3.2, 0.1.3.3, 0.1.3.4, 0.1.4.0, 0.1.4.1, 0.1.4.2, 0.1.4.3, 0.1.4.4, 0.1.4.5, 0.2.0.0, 0.2.1.0, 0.2.2.0, 0.2.3.0, 0.2.3.1, 0.2.4.0 |
---|---|
Dependencies | base (>=4.6 && <4.9), mmorph (>=1.0 && <1.2), mtl (>=2.1 && <2.3), transformers (>=0.3 && <0.5) [details] |
License | BSD-3-Clause |
Author | michaelt |
Maintainer | what_is_it_to_do_anything@yahoo.com |
Category | Data, Pipes |
Home page | https://github.com/michaelt/streaming |
Bug tracker | https://github.com/michaelt/streaming/issues |
Source repo | head: git clone https://github.com/michaelt/streaming |
Uploaded | by MichaelThompson at 2015-08-31T03:44:01Z |
Distributions | LTSHaskell:0.2.4.0, NixOS:0.2.4.0, Stackage:0.2.4.0 |
Reverse Dependencies | 80 direct, 91 indirect [details] |
Downloads | 48509 total (5 in the last 30 days) |
Rating | 2.5 (votes: 6) [estimated by Bayesian average] |
Your Rating | |
Status | Docs available [build log] Last success reported on 2015-08-31 [all 1 reports] |