Dflow
=====
Real time event processing using data flow declarations.
The following has been tested using ghc 7.0.4 under Fedora 15 64-bit.
Installation
------------
$ cabal configure
$ cabal build
$ cabal install
Tests
-----
$ cabal configure --enable-test
$ cabal build
$ cabal test
The tests work by building random networks of event processors and
checking them against an equivalent list implementation. Occasionally
they seem to hit a pathological case that chews up memory and CPU
time. If memory usage goes over 1GB then kill the test and try again.
Test Coverage
-------------
Edit the Dflow.cabal file and add "-fhpc" to the GHC options for the
test (see comment in the file). Then do "cabal clean" and follow the
instructions for "Tests" above. Then do:
$ hpc markup ArbTest.tix --destdir=coverage
The coverage report is in coverage/hpc_index.html.
Concepts
--------
The main data types for the application programmer are:
Event: A value that occurs at a certain time. For instance an
"Event Char" might represent a key press.
RTSP: The Real Time Stream Processor. A value of type "RTSP x y"
takes in events of type "x" and emits events of type "y". RTSPs can
be strung together into pipelines using "." (or ">>>" if you prefer
your data to flow left-to-right). RTSPs are also Monoids, so you can
fork your data through two parallel RTSPs and then merge the results.
RTA: A monad for building stateful RTSPs. Convert an RTA into an
RTSP using "execRTA" or "accumulateRTA" depending what you want to
do with pending output events when a new input event arrives.
You can test an RTSP in "fast time" (that is, without waiting for
real-time delays) by using "simulateRTSP". However the argument list
of input events must be finite. Then you can execute the RTSP in real
time using "execRTSP" and be confident that the real time behaviour
will match the fast-time behaviour.
To Do
-----
Events are currently sorted into time order using (in effect) an
O(n) insertion sort. Event streams should use something more
sophisticated internally, such as a heap.
What API, if any, should be exposed for event streams? On one hand
developers should be able to create new kinds of RTSP primitives
using event streams, but on the other hand anything you can do with
event streams can be done using RTA anyway.
Figure out some way for RTAs and RTSPs to execute non-blocking IO with
timeouts, probably using continuations in some way. Hence develop true
distribution by having RTSPs on different machines interact in a
declarative manner.
Make state persistent, together with a replay mechanism for lost
events.