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 {Lean, ReactorCore} from "../reactor/types.js" import {save_reaction} from "./parts/save_reaction.js" import {proxy_handlers} from "./parts/proxy_handlers.js" export class Flat implements ReactorCore { 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: S) { return new Proxy(state, this.#proxy_handlers) } reaction

(collector: () => P, responder?: (payload: P) => void) { 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: () => void): Lean { 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() } }