enso
Version:
Maximalist state & form management library for React
38 lines (36 loc) • 1.11 kB
JavaScript
export const detachedValue = Symbol();
export class UndefinedStateRegistry {
#external;
#refsMap = new Map();
#registry = new FinalizationRegistry(key => this.#refsMap.delete(key));
constructor(external) {
this.#external = external;
}
register(key, atom) {
const ref = new WeakRef(atom);
this.#refsMap.set(key, ref);
this.#registry.register(ref, key);
}
claim(key) {
// Look up if the undefined atom exists
const ref = this.#refsMap.get(key);
const registered = ref?.deref();
if (!ref || !registered) return;
// Unregister the atom and allow the caller to claim it
this.#registry.unregister(ref);
this.#refsMap.delete(key);
return registered;
}
ensure(key) {
// Try to look up registered undefined item
const registered = this.#refsMap.get(key)?.deref();
if (registered) return registered;
// Or create and register a new one
const atom = this.#external.constructor.create(detachedValue, {
key,
[this.#external.constructor.prop]: this.#external
});
this.register(key, atom);
return atom;
}
}