Rdataflow
Rdataflow is a JavaScript library for assembling computational processes.
It's like a spreadsheet calculator for your code.
Install
npm add rdataflow
Basic example
import { autorun, calc } from "rdataflow/calc";
import { WriteableState } from "rdataflow/write";
const redApples = WriteableState.value(5);
const greenApples = WriteableState.value(0);
const oranges = WriteableState.value(10);
const apples = calc(() => {
const r = redApples.value;
const g = greenApples.value;
const sum = r + g;
console.log(`${r} red apples + ${g} green apples = ${sum} apples`);
return sum;
});
const fruit = calc(() => {
const a = apples.value;
const o = oranges.value;
const sum = a + o;
console.log(`${a} apples + ${o} oranges = ${sum} fruit`);
return sum;
});
const run = autorun(() => {
fruit.value;
});
greenApples.setValue(10);
oranges.setValue(6);
run.dispose();
Features
Rdataflow recomputes when inputs, caching results and errors. When computations
are no longer required, they are disposed of.
The implementation of Rdataflow is rather simple, yielding robustness and good
performance.
calc()
calc()
combines other states.
Because calc()
is synchronous, no dependencies need be pre-declared outside
the calculation function itself.
Transaction
Changes happen in transactions, which prevent unnecessary or inconsistent
calculations. runAction()
runs the callback in a transaction.
import { autorun } from "rdataflow/calc";
import { runAction } from "rdataflow/transaction";
import { WriteableState } from "rdataflow/write";
const a = WriteableState.value(0);
const b = WriteableState.value(0);
const run = autorun(() => console.log(a.value + b.value));
runAction(() => {
a.setValue(1);
b.setValue(2);
});
run.dispose();
If a transaction does not already exist, it is created automatically.
Observables
States can be converted to and from
RxJS Observables.
import { stateToRx } from "rdataflow/observable";
import { WriteableState } from "rdataflow/write";
const state = WriteableState.value(1);
const observable = stateToRx(state);
const subscription = observable.subscribe((state) => console.log(state));
state.setValue(2);
subscription.unsubscribe();