UNPKG

memo-obj

Version:

A deep structural memoization utility for objects to reuse identical shapes and references efficiently.

86 lines (85 loc) 2.78 kB
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _WeakRefsSet_cleanup; export class WeakRefsSet { constructor() { this.set = new Set(); _WeakRefsSet_cleanup.set(this, new FinalizationRegistry((ref) => this.set.delete(ref))); } get size() { return this.set.size; } get(value) { if (value === undefined) return; for (const ref of this.set) { if (ref.deref() === value) return ref; } } addRef(ref) { const value = ref.deref(); if (value === undefined) return this; this.set.add(ref); __classPrivateFieldGet(this, _WeakRefsSet_cleanup, "f").register(value, ref, value); return this; } add(value, check = true) { if (check && this.has(value)) return this; const ref = new WeakRef(value); this.set.add(ref); __classPrivateFieldGet(this, _WeakRefsSet_cleanup, "f").register(value, ref, value); return this; } clear(fast = false) { if (!fast) { for (const ref of this.set) { const o = ref.deref(); if (o !== undefined) __classPrivateFieldGet(this, _WeakRefsSet_cleanup, "f").unregister(o); } } return this.set.clear(); } deleteRef(value) { if (this.set.delete(value)) { const o = value.deref(); if (o !== undefined) __classPrivateFieldGet(this, _WeakRefsSet_cleanup, "f").unregister(o); return true; } return false; } delete(value) { const ref = this.get(value); return ref !== undefined && this.deleteRef(ref); } forEach(callbackfn, thisArg) { return this.set.forEach(callbackfn, thisArg); } hasRef(value) { return this.set.has(value); } has(value) { return this.get(value) !== undefined; } entries() { return this.set.entries(); } keys() { return this.set.keys(); } values() { return this.set.values(); } [(_WeakRefsSet_cleanup = new WeakMap(), Symbol.iterator)]() { return this.set[Symbol.iterator](); } } WeakRefsSet[Symbol.toStringTag] = "WeakRefSet"; export default WeakRefsSet;