@hackage / churros

Channel/Arrow based streaming computation library.

Latest0.1.6.0

About

Metadata

  • Last updated , by LyndonMaydwell
  • License MIT
  • Maintained by: lyndon@sordina.net

  • Lottery factor: 0

Links

Installation

Readme

Churros

Chan + Arrow = Churro

Simple alternative to Conduit, Pipes, Streaming, Machines, etc.

Use-case is CSP like scenarios where you need a graph of actors.

Signup Example:

New-Users -->  Validate -------?----->  Deploy  -----?--------------> Log
Subscribe    REST Request      |      Run Server     |         Write File
{-> ID}    {ID -> (ID,Email}   |    {Email -> Port}  |  {Port|Receipt ->}
                               |                     |
                               +-------> Warn -------+
                                      Send Email
                                  {Email -> Receipt}

Developed from a history of attempting to use co-routines libraries for setting up complicated asynchronous processes such as collections of MIDI instruments, etc, but being frustrated by not easily being able to conditionally consume and emit events. In these situations I'd fall back on creating a bunch of Chans and piping events manually. Churros just formalises that strategy to help you get it right!

Advantages over other alternatives:

  • Focus on IO processes
  • Dynamic choice of consumption/production
  • Arrow instance
  • Choice of transport via the Transport class

Disadvantages:

  • No pure interface!
  • Type for the async action restricted to Monoid for most operations.
  • Limited ability to perform lock-step computation (although this is by design)

See Hackage for more info!

Examples

See ./test/ directory for more extensive examples.

import Control.Churro

main = do
   runWaitChan             $ sourceList [1..10] >>> processDebug "after source" >>> delay 1 {- seconds -} >>> arr succ >>> sinkPrint
   (wait =<<)  $ run @Chan $ sourceIO (\cb -> cb 1 >> print "Doing whatever!" >> cb 5) >>> filterC (> 3) >>> sinkIO print

Testing

Cabal test-suite including doctests:

cabal exec cabal test

Or for itterative development:

find {src,test} | entr -- cabal exec -- doctest -isrc -itest test/Churro/Test/Examples.hs

TODO