Files
eewing ec317eb17c
CI / build (push) Has been skipped
CI / deploy (push) Successful in 1m11s
INIT
2026-02-18 15:17:47 -06:00

32 lines
749 B
JavaScript

export class SharedState {
#factory;
#subscribers = 0;
#state = $state();
#scope;
constructor(factory) {
this.#factory = factory;
}
#dispose() {
this.#subscribers -= 1;
if (this.#scope && this.#subscribers <= 0) {
this.#scope();
this.#state = undefined;
this.#scope = undefined;
}
}
get(...args) {
this.#subscribers += 1;
if (this.#state === undefined) {
this.#scope = $effect.root(() => {
this.#state = this.#factory(...args);
});
}
$effect(() => {
return () => {
this.#dispose();
};
});
return this.#state;
}
}