machines: Networked stream transducers

[ bsd3, control, enumerator, library ] [ Propose Tags ]
Versions [RSS] 0.1, 0.1.1, 0.1.2, 0.2.1,,,, 0.2.2, 0.2.3,, 0.2.4, 0.2.5, 0.4,, 0.4.1, 0.5.1, 0.6, 0.6.1, 0.6.2, 0.6.3, 0.6.4, 0.7, 0.7.1, 0.7.2, 0.7.3
Change log CHANGELOG.markdown
Dependencies adjunctions (>=4.2 && <5), base (>=4.5 && <5), comonad (>=3 && <6), containers (>=0.3 && <0.8), distributive (<0.7), fail (>=4.9 && <4.10), mtl (>=2 && <2.4), pointed (>=3 && <6), profunctors (>=3 && <6), semigroupoids (>=5 && <7), semigroups (>=0.8.3 && <1), transformers (>=0.3 && <0.7), transformers-compat (>=0.3), void (>=0.6.1 && <1) [details]
License BSD-3-Clause
Copyright Copyright (C) 2012-2015 Edward A. Kmett
Author Edward A. Kmett, Rúnar Bjarnason, Josh Cough
Maintainer Edward A. Kmett <>
Revised Revision 3 made by ryanglscott at 2023-09-30T13:48:23Z
Category Control, Enumerator
Home page
Bug tracker
Source repo head: git clone git://
Uploaded by ryanglscott at 2022-05-18T11:56:53Z
Distributions LTSHaskell:0.7.3, NixOS:0.7.3, Stackage:0.7.3
Reverse Dependencies 29 direct, 3 indirect [details]
Downloads 27450 total (101 in the last 30 days)
Rating 2.5 (votes: 4) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2022-05-18 [all 1 reports]

Readme for machines-0.7.3

[back to package description]


Hackage Build Status

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 Machine.

More complicated machines provide other ways of connecting to them.

Typically the use of machines proceeds by using simple plans into machine Tees and Wyes, capping many of the inputs to those with possibly monadic sources, feeding the rest input (possibly repeatedly) and calling run or runT to get the answers out.

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

Some worked examples are here

Contact Information

Contributions and bug reports are welcome!

Please feel free to contact me through github or on the #haskell IRC channel on

-Edward Kmett