• Jump To … +
    src/tuple.js src/universal-weak-map.js src/util.js
  • universal-weak-map.js

  • ¶

    A map data structure that holds object keys weakly, yet can also hold non-object keys, unlike the native WeakMap.

    export class UniversalWeakMap { constructor() {
  • ¶

    Since a WeakMap cannot hold primitive values as keys, we need a backup Map instance to hold primitive keys. Both this._weakMap and this._strongMap are lazily initialized.

     this._weakMap = null; this._strongMap = null; }
  • ¶

    Since get and set are the only methods used, that’s all I’ve implemented here.

     get(key) { const map = this._getMap(key, false); if (map) { return map.get(key); } } set(key, value) { this._getMap(key, true).set(key, value);
  • ¶

    An actual Map or WeakMap would return this here, but returning the value is more convenient for the tuple implementation.

     return value; } _getMap(key, canCreate) { if (! canCreate) { return isObjRef(key) ? this._weakMap : this._strongMap; } if (isObjRef(key)) { return this._weakMap || (this._weakMap = new WeakMap); } return this._strongMap || (this._strongMap = new Map); } } function isObjRef(value) { switch (typeof value) { case "object": if (value === null) { return false; } case "function": return true; default: return false; } }