ClojureScript functional reactive programming library.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


ClojureScript functional reactive programming library inspired by Flapjax. Shafty provides the core abstractions provided by Flapjax for dataflow programming with reactive values, however does not provide the DOM manipulation abstractions provided by Flapjax.


Shafty is currently under development and the API is subject to change.

Get in touch if you are interested in helping out.


Shafty aims to bring a native implementation of composable behaviours and event streams to ClojureScript as a micro-library which can be used to build larger reactive applications. The long-term goal is to provide a Clojure implementation which can be used in both server-side and client-side applications.



Events represent time-varying functions which have a finite set of occurences over time.


Behaviours are time-varying functions which constantly have a value. Derive a behaviour from an event, or generate a receiver to watch a particular DOM element, such as an input field.

API Reference

As Shafty is heavily inspired by Flapjax, provided below is an API reference outlining which parts of the Flapjax API have been implemented and what the equivalent function name is in Shafty. Some of the functions have similar mappings leveraging Clojure's protocols.

The combinators below appear in the order of the appearance of each in the Flapjax implementation.

F.Event shafty.core.Event F.Behavior shafty.core.Behaviour
sendEvent send! startsWith hold!
mergeE merge! valueNow cljs.core.deref
constantE constant! changes changes!
bindE bind! switchB switch!
mapE map! timerB timer! / hold!
notE not! delayB delay!
filterE filter! sendBehavior send!
onceE once! liftB lift!
skipFirstE skip-first! notB not!
collectE collect! blindB blind!
switchE switch! calmB calm!
delayE delay!
snapshotE snapshot!
filterRepeatsE filter-repeats!
calmE calm!
blindE blind!
timerE timer!


The Name


Copyright (C) 2012 Christopher Meiklejohn.

Distributed under the Eclipse Public License, the same as Clojure.