|
|
@@ -14,11 +14,35 @@ class ChainMap {
|
|
|
constructor() {
|
|
|
|
|
|
/**
|
|
|
- * The root Weak Map.
|
|
|
+ * A map of Weak Maps by their key length.
|
|
|
*
|
|
|
- * @type {WeakMap<Object, WeakMap>}
|
|
|
+ * @type {Object<number, WeakMap>}
|
|
|
*/
|
|
|
- this.weakMap = new WeakMap();
|
|
|
+ this.weakMaps = {};
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Returns the Weak Map for the given keys.
|
|
|
+ *
|
|
|
+ * @param {Array<Object>} keys - List of keys.
|
|
|
+ * @return {WeakMap} The weak map.
|
|
|
+ */
|
|
|
+ _getWeakMap( keys ) {
|
|
|
+
|
|
|
+ const length = keys.length;
|
|
|
+
|
|
|
+ let weakMap = this.weakMaps[ length ];
|
|
|
+
|
|
|
+ if ( weakMap === undefined ) {
|
|
|
+
|
|
|
+ weakMap = new WeakMap();
|
|
|
+ this.weakMaps[ length ] = weakMap;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return weakMap;
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -30,7 +54,7 @@ class ChainMap {
|
|
|
*/
|
|
|
get( keys ) {
|
|
|
|
|
|
- let map = this.weakMap;
|
|
|
+ let map = this._getWeakMap( keys );
|
|
|
|
|
|
for ( let i = 0; i < keys.length - 1; i ++ ) {
|
|
|
|
|
|
@@ -53,7 +77,7 @@ class ChainMap {
|
|
|
*/
|
|
|
set( keys, value ) {
|
|
|
|
|
|
- let map = this.weakMap;
|
|
|
+ let map = this._getWeakMap( keys );
|
|
|
|
|
|
for ( let i = 0; i < keys.length - 1; i ++ ) {
|
|
|
|
|
|
@@ -79,7 +103,7 @@ class ChainMap {
|
|
|
*/
|
|
|
delete( keys ) {
|
|
|
|
|
|
- let map = this.weakMap;
|
|
|
+ let map = this._getWeakMap( keys );
|
|
|
|
|
|
for ( let i = 0; i < keys.length - 1; i ++ ) {
|
|
|
|