@benev/slate
Version:
frontend web stuff
46 lines • 1.81 kB
JavaScript
import { Locker } from "./parts/locker.js";
import { Tracker } from "./parts/tracker.js";
import { Stopper } from "./parts/stopper.js";
import { Recorder } from "./parts/recorder.js";
import { readonly } from "./parts/readonly.js";
import { Scheduler } from "./parts/scheduler.js";
import { collectivize } from "./parts/collectivize.js";
import { save_reaction } from "./parts/save_reaction.js";
import { proxy_handlers } from "./parts/proxy_handlers.js";
export class Flat {
static readonly = readonly;
static collectivize = collectivize;
#tracker = new Tracker();
#recorder = new Recorder();
#locker = new Locker();
#stopper = new Stopper();
#scheduler = new Scheduler();
#proxy_handlers = proxy_handlers(this.#tracker, this.#recorder, this.#locker, this.#stopper, this.#scheduler);
get wait() {
return this.#scheduler.wait;
}
state(state) {
return new Proxy(state, this.#proxy_handlers);
}
reaction(collector, responder) {
const symbol = Symbol();
const { recording } = this.#recorder.record(() => this.#locker.lock(collector));
this.#stopper.add(symbol, save_reaction(symbol, recording, this.#tracker, { collector, responder }));
return () => this.#stopper.stop(symbol);
}
lean(actor) {
const symbol = Symbol();
return {
stop: () => this.#stopper.stop(symbol),
collect: collector => {
const { payload, recording } = this.#recorder.record(() => this.#locker.lock(collector));
this.#stopper.add(symbol, save_reaction(symbol, recording, this.#tracker, { lean: true, actor }));
return payload;
},
};
}
clear() {
this.#tracker.clear();
}
}
//# sourceMappingURL=flat.js.map