BSD-3-Clause licensed by Edward A. Kmett, Rúnar Bjarnason, Josh Cough
Maintained by Edward A. Kmett
This version can be pinned in stack with:machines-0.6.4@sha256:12611f1f59736da3ff841d71184670614a0cacae434578f02908fc1660ff64eb,3398


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


0.6.4 [2018.07.03]

  • Add Semigroup and Monoid instances for Mealy and MealyT.
  • Mark runT and runT_ as INLINEABLE.
  • Increase the scope of the benchmarks. Also include the streaming library among the things that are benchmarked.
  • Allow building with containers-0.6.


  • Add Semigroup instance for Is
  • Add MonadFail instance for PlanT
  • Support doctest-0.12


  • Revamp Setup.hs to use cabal-doctest. This makes it build with Cabal-2.0, and makes the doctests work with cabal new-build and sandboxes.
  • Various performance improvements
  • Add the flattened and traversing functions, as well as the AutomatonM class, to Data.Machine.Process
  • Add the Data.Machine.MealyT module
  • Add plug to Data.Machine.Source
  • Add capT to Data.Machine.Tee
  • Fix a bug in teeT that caused it to run actions too many times
  • Add capWye to Data.Machine.Wye


  • Bumped upper version bounds for comonad, conduit-combinators, criterion, distributive, pointed, and transformers
  • Fix compilation with stack
  • Added strippingPrefix, unfold, unfoldT, zipping


  • Added better fanout combinators. Data.Machine.Fanout
  • Added a module for lifting machines that run in transformed monads. Data.Machine.Lift
  • Added instances for Mealy and Moore.
  • Explicitly implemented (<*>) (*>) and (<*) for PlanT.
  • Added Data.Machine.Runner with various tools for running machines.
  • Added teeT.
  • Added unfoldPlan and preplan


  • profunctors 5 support
  • GHC 7.10 warnings have been cleaned up


  • Major bug fix (and semantic change) for Plan’s (<|>).


  • Add Monoid and Semigroups instances for MachineT


  • Support void 0.7, fixed upper bounds on dependencies going forward.

  • Bumped the bounds for mtl and transformers



  • Added deconstruct, tagDone and finishWith


  • Added asParts, sinkPart_, autoM, and fitM


  • Fixed the Mealy Monad


  • Removed the input type parameter from (almost) all of the types.


  • Initial release