UNPKG

enso

Version:

Maximalist state & form management library for React

38 lines (36 loc) 1.11 kB
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; } }