memo-obj
Version:
A deep structural memoization utility for objects to reuse identical shapes and references efficiently.
86 lines (85 loc) • 2.78 kB
JavaScript
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;