2014-07-10 19:57:02 +00:00
|
|
|
# freactive
|
|
|
|
|
2014-07-10 20:07:28 +00:00
|
|
|
Work in progress!
|
2014-07-10 19:57:02 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
## Overview
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
The goal of this library is to provide some idioms for functional reactive
|
|
|
|
programming based on Clojure's already existing `deref`, `swap!` and `reset!`
|
|
|
|
patterns.
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
Example:
|
|
|
|
```clj
|
|
|
|
(ns test-freactive
|
|
|
|
(:refer-clojure :exclude [atom])
|
|
|
|
(:require [freactive.core :refer [atom rx lens cursor]))
|
|
|
|
|
|
|
|
|
|
|
|
(def a1 (atom 0))
|
|
|
|
(def a2 (atom 0))
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
(def my-rx (rx (+ @a1 @a2))
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
(println @my-rx)
|
|
|
|
;; 0
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
(swap! a1 inc)
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
(println @my-rx)
|
|
|
|
;; 1
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
```
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
All of the data types in this library implement the `IDeref` interface and
|
|
|
|
when they are `deref`'ed from another "reactive expression" will be registered
|
|
|
|
as dependents.
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
## Reactive Atoms
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
Reactive atoms are the same as standard Clojure atoms, except for two differences:
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
* When `deref` is called on a reactive atom, it calls a `register-dep` function
|
|
|
|
with itself as an argument so that it can be registered as a dependency to
|
|
|
|
a computation that has bound the `*register-dep*` var in the current scope.
|
|
|
|
* Reactive atoms will not notify their watches unless they have actually changed
|
|
|
|
(i.e. they will do an equality test between the old value and new value before
|
|
|
|
notifying of changes).
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
## Reactive Expressions
|
2014-07-10 20:07:28 +00:00
|
|
|
|
2014-11-12 18:17:35 +00:00
|
|
|
A reactive expression is an `IDeref` instance whose value is the result of
|
|
|
|
a computation that can be updated reactively when it's dependencies are
|
|
|
|
invalidatted.
|
|
|
|
|
|
|
|
|
|
|
|
## Reactive Lenses
|
|
|
|
|
|
|
|
|
|
|
|
## Reactive Cursors
|
2014-07-10 19:57:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
2014-07-10 20:07:28 +00:00
|
|
|
Copyright © 2014 Aaron Craelius
|
|
|
|
Some content Copyright © Rich Hickey
|
2014-07-10 19:57:02 +00:00
|
|
|
|
|
|
|
Distributed under the Eclipse Public License either version 1.0 or (at
|
|
|
|
your option) any later version.
|