You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.2 KiB
51 lines
1.2 KiB
let wmUniqueIndex = Math.round(Math.random() * 9);
|
|
|
|
const supportDefineProperty = typeof Object.defineProperty === 'function';
|
|
|
|
export default class WeakMap<K extends object, V> {
|
|
|
|
protected _id: string;
|
|
|
|
constructor() {
|
|
this._id = '__ec_inner_' + wmUniqueIndex++;
|
|
}
|
|
|
|
get(key: K): V {
|
|
return (this._guard(key) as any)[this._id];
|
|
}
|
|
|
|
set(key: K, value: V): WeakMap<K, V> {
|
|
const target = this._guard(key) as any;
|
|
if (supportDefineProperty) {
|
|
Object.defineProperty(target, this._id, {
|
|
value: value,
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
}
|
|
else {
|
|
target[this._id] = value;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
delete(key: K): boolean {
|
|
if (this.has(key)) {
|
|
delete (this._guard(key) as any)[this._id];
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
has(key: K): boolean {
|
|
return !!(this._guard(key) as any)[this._id];
|
|
}
|
|
|
|
protected _guard(key: K): K {
|
|
if (key !== Object(key)) {
|
|
throw TypeError('Value of WeakMap is not a non-null object.');
|
|
}
|
|
return key;
|
|
}
|
|
}
|