Ceci n'est pas une pipe
Machines are demand driven input sources like pipes or conduits, but can support multiple inputs.
You design a
Machine by writing a
Plan. You then
construct the machine.
Simple machines that take one input are called a
Process and processes form a
Category. More generally you can attach a
Process to the output of any type of
Machine, yielding a new
More complicated machines provide other ways of connecting to them.
Typically the use of machines proceeds by using simple plans into machine
Wyes, capping many of the inputs to
those with possibly monadic sources, feeding the rest input (possibly repeatedly) and calling
runT to get the
There is a lot of flexibility when building a machine in choosing between empowering the machine to run its own monadic effects or delegating that responsibility to a custom driver.
A port of this design to scala is available from runarorama/scala-machines
Runar's slides are also available from https://dl.dropbox.com/u/4588997/Machines.pdf
Some worked examples are here https://github.com/alanz/machines-play
Contributions and bug reports are welcome!
Please feel free to contact me through github or on the #haskell IRC channel on irc.freenode.net.
cabal-doctest. This makes it build with
Cabal-2.0, and makes the
doctests work with
cabal new-buildand sandboxes.
- Various performance improvements
- Add the
traversingfunctions, as well as the
- Add the
- Fix a bug in
teeTthat caused it to run actions too many times
- Bumped upper version bounds for
- Fix compilation with
- Added better fanout combinators.
- Added a module for lifting machines that run in transformed monads.
- Added instances for
- Explicitly implemented
Data.Machine.Runnerwith various tools for running machines.
- GHC 7.10 warnings have been cleaned up
Major bug fix (and semantic change) for
void0.7, fixed upper bounds on dependencies going forward.
Bumped the bounds for
Removed the input type parameter from (almost) all of the types.
- Initial release