weakref
Version:
Extend built-in collections with weak references for efficient garbage collection and optimal performance in memory-intensive applications with IterableWeakSet, IterableWeakMap, and WeakValueMap.
77 lines (76 loc) • 3.24 kB
JavaScript
"use strict";
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 _IterableWeakSet_weakMap, _IterableWeakSet_set, _IterableWeakSet_registry;
Object.defineProperty(exports, "__esModule", { value: true });
exports.IterableWeakSet = void 0;
class IterableWeakSet {
constructor(iterable = null) {
_IterableWeakSet_weakMap.set(this, new WeakMap());
_IterableWeakSet_set.set(this, new Set());
_IterableWeakSet_registry.set(this, new FinalizationRegistry(__classPrivateFieldGet(this, _IterableWeakSet_set, "f").delete.bind(__classPrivateFieldGet(this, _IterableWeakSet_set, "f"))));
for (const value of iterable ?? []) {
this.add(value);
}
}
get size() {
return __classPrivateFieldGet(this, _IterableWeakSet_set, "f").size;
}
add(value) {
if (this.has(value)) {
return this;
}
const ref = new WeakRef(value);
__classPrivateFieldGet(this, _IterableWeakSet_weakMap, "f").set(value, ref);
__classPrivateFieldGet(this, _IterableWeakSet_set, "f").add(ref);
__classPrivateFieldGet(this, _IterableWeakSet_registry, "f").register(value, ref, ref);
return this;
}
clear() {
for (const value of __classPrivateFieldGet(this, _IterableWeakSet_set, "f")) {
this.delete(value.deref());
}
}
delete(value) {
const ref = __classPrivateFieldGet(this, _IterableWeakSet_weakMap, "f").get(value);
if (ref) {
__classPrivateFieldGet(this, _IterableWeakSet_set, "f").delete(ref);
__classPrivateFieldGet(this, _IterableWeakSet_weakMap, "f").delete(value);
__classPrivateFieldGet(this, _IterableWeakSet_registry, "f").unregister(ref);
return true;
}
return false;
}
has(value) {
return __classPrivateFieldGet(this, _IterableWeakSet_weakMap, "f").has(value);
}
forEach(callbackfn, thisArg) {
for (const tuple of this.entries()) {
callbackfn.call(thisArg, tuple[0], tuple[1], this);
}
}
get [(_IterableWeakSet_weakMap = new WeakMap(), _IterableWeakSet_set = new WeakMap(), _IterableWeakSet_registry = new WeakMap(), Symbol.toStringTag)]() {
return "IterableWeakSet";
}
*[Symbol.iterator]() {
for (const ref of __classPrivateFieldGet(this, _IterableWeakSet_set, "f")) {
yield ref.deref();
}
}
*entries() {
for (const ref of __classPrivateFieldGet(this, _IterableWeakSet_set, "f")) {
const value = ref.deref();
yield [value, value];
}
}
keys() {
return this[Symbol.iterator]();
}
values() {
return this[Symbol.iterator]();
}
}
exports.IterableWeakSet = IterableWeakSet;