Files
starface-outlook-sync-addin/node_modules/thingies/lib/sync.js
T
Stefan Hacker 37ad745546 first commit
2026-04-03 09:38:48 +02:00

63 lines
2.0 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.comp = exports.val = exports.Computed = exports.Value = void 0;
const fanout_1 = require("./fanout");
const NO_CACHE = Symbol();
class Value extends fanout_1.FanOut {
constructor(value) {
super();
/** ----------------------------------------------------- {@link SyncStore} */
this.subscribe = (cb) => this.listen(cb);
this.getSnapshot = () => this.value;
this.value = value;
}
next(value, force = false) {
if (!force && this.value === value)
return;
this.value = value;
this.emit();
}
}
exports.Value = Value;
class Computed extends fanout_1.FanOut {
constructor(deps, compute) {
super();
this.deps = deps;
this.compute = compute;
this.cache = NO_CACHE;
/** ----------------------------------------------------- {@link SyncStore} */
this.subscribe = (cb) => this.listen(cb);
this.getSnapshot = () => this._comp();
const subs = (this.subs = []);
const length = deps.length;
for (let i = 0; i < length; i++) {
const dep = deps[i];
const sub = dep.listen(() => {
this.cache = NO_CACHE;
this.emit();
});
subs.push(sub);
}
}
_comp() {
const cached = this.cache;
if (cached !== NO_CACHE)
return cached;
return (this.cache = this.compute(this.deps.map((dep) => dep.getSnapshot())));
}
/** ----------------------------------------------------- {@link SyncValue} */
get value() {
return this._comp();
}
/** ---------------------------------------------------- {@link Disposable} */
dispose() {
for (const sub of this.subs)
sub();
}
}
exports.Computed = Computed;
const val = (initial) => new Value(initial);
exports.val = val;
const comp = (deps, compute) => new Computed(deps, compute);
exports.comp = comp;