UNPKG

@benev/slate

Version:
50 lines 1.53 kB
import { StateTree } from "./state_tree.js"; import { deep } from "../tools/deep/deep.js"; import { debounce } from "../tools/debounce/debounce.js"; export class WatchTower { #signals; #computeds = new Set(); #listeners = new Set(); #memory = new Map(); #dispatchPromise = Promise.resolve(); constructor(signals) { this.#signals = signals; } get wait() { return this.#dispatchPromise; } #dispatch = debounce(0, () => { for (const computed of this.#computeds) computed(); for (const listener of this.#listeners) listener(); }); dispatch() { this.#dispatchPromise = this.#dispatch(); } computed(fun) { const box = this.#signals.signal(fun()); this.#computeds.add(() => { box.value = fun(); }); return box; } track(collector, responder) { let first = true; const listener = () => { const current = collector(); const previous = this.#memory.get(collector); if (first || !deep.equal(current, previous)) { first = false; this.#memory.set(collector, current); responder(current); } }; listener(); this.#listeners.add(listener); const untrack = () => this.#listeners.delete(listener); return untrack; } stateTree(state) { return new StateTree(state, () => this.dispatch()); } } //# sourceMappingURL=tower.js.map