Skip to content

apatil/selfless

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

Date

3 June 2009

Author

Anand Patil

Contact

anand.prabhakar.patil@gmail.com

Copyright

Anand Patil, 2009.

License

See LICENSE

Selfless provides stateless, lazy dataflow for Clojure. It separates the dataflow model and the state, so many states can be updated concurrently.

NOTE: The 'delay' branch (which you are using) requires the par branch of clojure, available from http://github.com/richhickey/clojure/tree/par. To build it, you'll need Rich Hickey's build of the jsr166 from http://cloud.github.com/downloads/richhickey/clojure/jsr166y.jar on your classpath.

Usage

First, build a dataflow:

(defn fn2 [a b c d e] [a b c d e])     
(defn fn3 [fn2] (apply + fn2))

(def flow (add-root {} :fn1))
(def flow2 (add-node flow :fn2 fn2 [:fn1 17 :fn1 2 5]))
(def flow3 (add-oblivious flow2 :fn3 fn3 [:fn2]))

The arguments of add-node and add-oblivious are [flow key fun & [args]]. The resulting dataflow is a {:key node} map. Nodes hold functions, parents, children, and timing slots. Timing can be lazy (the default) and oblivious, meaning a node does not do anything in response to parent updates. add-root is a version of add-node that assumes the node has no parents & that a value for it must be provided.

Having created the dataflow, you can create functions flow3-init, flow3-forget and flow3-change with:

(def-flosures flow3)

or if you don't want to bind the functions to vars you can create them in a map keyed by :init, :forget and :change with:

(flosures flow3)

Then you can use the with-flosures macro, which creates a context within which the functions init, forget and change are understood to pertain to the given flow:

(with-flosures (flosures flow3)
    (let
        [init-state (init {:fn1 3})
        init-vals (force-state init-state)
        partial-state (forget init-state :fn2)
        altered-state (change new-state {:fn1 3})]
        [init-state init-vals altered-state]))

Concurrency

Nodes' values are wrapped in delays. When you force a value, it forces its parents' values, and so on. Evaluations are done concurrently (using pmap) where possible. The force-state function evaluates the entire state and strips away the delays.

About

Stateless dataflow for Clojure

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published