patchable

Simple immutable, but patchable values

Usage no npm install needed!

<script type="module">
  import patchable from 'https://cdn.skypack.dev/patchable';
</script>

README

Patchable

Functional state made easy.

What?

Patchable provides a simple JS API to handle immutable values.

It is a simple wrapper on top of the amazing library Immer (If you need it's full power, please use it directly!)

In addition to Immer wrappers, Patchable also provides a super simple reference cell with getter, setter and mutator functions.

API

immutable

Creates an immutable value.

const val = immutable([4, 7, 9, 10]);

val[1] = 6; // fails (silently)
val[1]; // ==> 7

patched

Takes a value and a function that patches the value, and generates a patched value.

const val = immutable([4, 7, 9, 10]);

const val2 = patched(val, (v) => (v[1] = 6));

val[1]; // ==> 6

patching

Curried version of patched.

const val = immutable([4, 7, 9, 10]);

const valPatcher = patching(val);

const val2 = valPatcher(v) => (v[1] = 6));

val[1]; // ==> 6

patcher

Takes a patch function and returns a function which you can call with a value to be updated.

const incrementorOfFirstValue = patcher((v) => (v[1] += 1));

const val = immutable([4, 7, 9, 10]);

const val2 = incrementorOfFirstValue(val);

val[1]; // ==> 8

patchRef

Creates a "reference cell" and returns 3 functions to read, write and update the cell value.

const initialValue = { name: "John", age: 21, balance: 250 };
const [getter, setter, mutator] = patchRef(initialValue);

getter(); // ==> { name: "John", age: 21, balance: 250 };

getter()["balance"]; // ==> 250

setter({
  name: "Jane",
  age: 25,
});

getter(); // ==> { name: "Jane", age: 25 }

mutator((prev) => {
  prev.age = prev.age + 1;
});

getter(); // ==> { name: "Jane", age: 26 }