@benev/slate
Version:
frontend web stuff
50 lines • 1.53 kB
JavaScript
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