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

[ bsd3, control, library ] [ Propose Tags ]

Translate pull-based folds from the "streaming" package into push-based folds from the "foldl" package.

[Skip to Readme]
Versions [faq],,,,,,
Change log CHANGELOG
Dependencies base (>=4.8 && <5), foldl (>=1.1.5), pipes (>=4.1.0), streaming (>=, transformers (>= [details]
License BSD-3-Clause
Copyright 2016 Daniel Diaz
Author Daniel Diaz
Revised Revision 1 made by DanielDiazCarrete at Fri Apr 7 15:39:11 UTC 2017
Category Control
Bug tracker
Source repo head: git clone
Uploaded by DanielDiazCarrete at Wed Mar 8 22:16:23 UTC 2017
Distributions NixOS:
Downloads 2740 total (168 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2017-03-08 [all 1 reports]




Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees

Readme for streaming-eversion-

[back to package description]

What's in this library?

Functions that turn pull-based stream operations from the pipes/streaming ecosystem into push-based, iteratee-like stream operations. Inspired by the blog post Programmatic translation to iteratees from pull-based code.

Could you go into more detail?

There are three streaming libraries that often go together: pipes, streaming, and foldl. Of these, the first two are pull-based: you take some (possibly effectful) source of values and keep extracting stuff until the source is exhausted and/or you have obtained all the info you need. Meanwhile, foldl is push-based: foldl folds are not directly aware of any source, they are like little state machines that keep running as long as someone feeds them input. Usually, defining stream transformations in pull-based mode is easier and feels more natural. The pipes ecosystem already provides a lot of them: parsers, decoders, splitters. However, push-based mode also has advantages. Push-based abstractions are not tied to a particular type of source because data is fed externally. And foldl folds have very useful Applicative and Comonad instances. Also, sometimes a library will only offer a push-based interface. Wouldn't it be nice if you could adapt already existing pull-based operations to work on push-based consumers? For example, using a decoding function from Pipes.Text.Encoding to preprocess the inputs of a Fold. This library provides that.