@efesto-cloud/compute
v0.0.4
Published
Computed observable type for efesto-cloud
Readme
@efesto-cloud/compute
A Computed<T> observable derived from one or more Observable dependencies. Re-evaluates (and notifies) only when the computed value actually changes.
The package is named
@efesto-cloud/computebut lives inpackages/computed.
Installation
pnpm add @efesto-cloud/compute @efesto-cloud/observableQuick Start
import { Observable } from "@efesto-cloud/observable";
import { Computed } from "@efesto-cloud/compute";
const firstName = new Observable("Ada");
const lastName = new Observable("Lovelace");
const fullName = new Computed(
[firstName, lastName],
([first, last]) => `${first} ${last}`,
);
const off = fullName.subscribe((name) => console.log(name));
firstName.set("Grace"); // logs: "Grace Lovelace"
lastName.set("Lovelace"); // no log — identical result, no notify
off();
fullName.dispose(); // unsubscribes from every dependencyAPI
Computed<T, DEPS> implements IObservable<T>:
new Computed<T, DEPS>(
dependencies: { [K in keyof DEPS]: IObservable<DEPS[K]> },
computeFn: (values: DEPS) => T,
);
get(): T;
set(value: T): void; // no-op — Computed is read-only
subscribe(cb: (value: T) => void): Unsubscribe;
dispose(): void; // unsubscribe from deps and drop listenersRules
Computedis read-only:set()is a no-op.- Subscribers fire only when
compute()produces a value not===to the previous one. This is reference equality — return the same array/object reference if you want dedup to work. - Always call
dispose()when the owning object is torn down; otherwise theComputedkeeps subscriptions to its dependencies alive.
Example: derived from many sources
const a = new Observable(1);
const b = new Observable(2);
const c = new Observable(3);
const sum = new Computed([a, b, c], ([x, y, z]) => x + y + z);
sum.subscribe((v) => console.log("sum:", v));
b.set(20); // logs: sum: 24Related
@efesto-cloud/observable— source of truth for values.@efesto-cloud/publisher— events without stored state.
