@@ -14,11 +14,35 @@ class ChainMap {
1414 constructor ( ) {
1515
1616 /**
17- * The root Weak Map .
17+ * A map of Weak Maps by their key length .
1818 *
19- * @type {WeakMap< Object, WeakMap> }
19+ * @type {Object<number , WeakMap> }
2020 */
21- this . weakMap = new WeakMap ( ) ;
21+ this . weakMaps = { } ;
22+
23+
24+ }
25+
26+ /**
27+ * Returns the Weak Map for the given keys.
28+ *
29+ * @param {Array<Object> } keys - List of keys.
30+ * @return {WeakMap } The weak map.
31+ */
32+ _getWeakMap ( keys ) {
33+
34+ const length = keys . length ;
35+
36+ let weakMap = this . weakMaps [ length ] ;
37+
38+ if ( weakMap === undefined ) {
39+
40+ weakMap = new WeakMap ( ) ;
41+ this . weakMaps [ length ] = weakMap ;
42+
43+ }
44+
45+ return weakMap ;
2246
2347 }
2448
@@ -30,7 +54,7 @@ class ChainMap {
3054 */
3155 get ( keys ) {
3256
33- let map = this . weakMap ;
57+ let map = this . _getWeakMap ( keys ) ;
3458
3559 for ( let i = 0 ; i < keys . length - 1 ; i ++ ) {
3660
@@ -53,7 +77,7 @@ class ChainMap {
5377 */
5478 set ( keys , value ) {
5579
56- let map = this . weakMap ;
80+ let map = this . _getWeakMap ( keys ) ;
5781
5882 for ( let i = 0 ; i < keys . length - 1 ; i ++ ) {
5983
@@ -79,7 +103,7 @@ class ChainMap {
79103 */
80104 delete ( keys ) {
81105
82- let map = this . weakMap ;
106+ let map = this . _getWeakMap ( keys ) ;
83107
84108 for ( let i = 0 ; i < keys . length - 1 ; i ++ ) {
85109
0 commit comments