UNPKG

5.49 kBJavaScriptView Raw
1/**
2 * @private
3 */
4var DeepMapEntry = /** @class */ (function () {
5 function DeepMapEntry(base, args) {
6 Object.defineProperty(this, "base", {
7 enumerable: true,
8 configurable: true,
9 writable: true,
10 value: base
11 });
12 Object.defineProperty(this, "args", {
13 enumerable: true,
14 configurable: true,
15 writable: true,
16 value: args
17 });
18 Object.defineProperty(this, "root", {
19 enumerable: true,
20 configurable: true,
21 writable: true,
22 value: void 0
23 });
24 Object.defineProperty(this, "closest", {
25 enumerable: true,
26 configurable: true,
27 writable: true,
28 value: void 0
29 });
30 Object.defineProperty(this, "closestIdx", {
31 enumerable: true,
32 configurable: true,
33 writable: true,
34 value: 0
35 });
36 Object.defineProperty(this, "isDisposed", {
37 enumerable: true,
38 configurable: true,
39 writable: true,
40 value: false
41 });
42 var current = (this.closest = this.root = base);
43 var i = 0;
44 for (; i < this.args.length - 1; i++) {
45 current = current.get(args[i]);
46 if (current)
47 this.closest = current;
48 else
49 break;
50 }
51 this.closestIdx = i;
52 }
53 Object.defineProperty(DeepMapEntry.prototype, "exists", {
54 enumerable: false,
55 configurable: true,
56 writable: true,
57 value: function () {
58 this.assertNotDisposed();
59 var l = this.args.length;
60 return this.closestIdx >= l - 1 && this.closest.has(this.args[l - 1]);
61 }
62 });
63 Object.defineProperty(DeepMapEntry.prototype, "get", {
64 enumerable: false,
65 configurable: true,
66 writable: true,
67 value: function () {
68 this.assertNotDisposed();
69 if (!this.exists())
70 throw new Error("Entry doesn't exist");
71 return this.closest.get(this.args[this.args.length - 1]);
72 }
73 });
74 Object.defineProperty(DeepMapEntry.prototype, "set", {
75 enumerable: false,
76 configurable: true,
77 writable: true,
78 value: function (value) {
79 this.assertNotDisposed();
80 var l = this.args.length;
81 var current = this.closest;
82 // create remaining maps
83 for (var i = this.closestIdx; i < l - 1; i++) {
84 var m = new Map();
85 current.set(this.args[i], m);
86 current = m;
87 }
88 this.closestIdx = l - 1;
89 this.closest = current;
90 current.set(this.args[l - 1], value);
91 }
92 });
93 Object.defineProperty(DeepMapEntry.prototype, "delete", {
94 enumerable: false,
95 configurable: true,
96 writable: true,
97 value: function () {
98 this.assertNotDisposed();
99 if (!this.exists())
100 throw new Error("Entry doesn't exist");
101 var l = this.args.length;
102 this.closest.delete(this.args[l - 1]);
103 // clean up remaining maps if needed (reconstruct stack first)
104 var c = this.root;
105 var maps = [c];
106 for (var i = 0; i < l - 1; i++) {
107 c = c.get(this.args[i]);
108 maps.push(c);
109 }
110 for (var i = maps.length - 1; i > 0; i--) {
111 if (maps[i].size === 0)
112 maps[i - 1].delete(this.args[i - 1]);
113 }
114 this.isDisposed = true;
115 }
116 });
117 Object.defineProperty(DeepMapEntry.prototype, "assertNotDisposed", {
118 enumerable: false,
119 configurable: true,
120 writable: true,
121 value: function () {
122 // TODO: once this becomes annoying, we should introduce a reset method to re-run the constructor logic
123 if (this.isDisposed)
124 throw new Error("Concurrent modification exception");
125 }
126 });
127 return DeepMapEntry;
128}());
129export { DeepMapEntry };
130/**
131 * @private
132 */
133var DeepMap = /** @class */ (function () {
134 function DeepMap() {
135 Object.defineProperty(this, "store", {
136 enumerable: true,
137 configurable: true,
138 writable: true,
139 value: new Map()
140 });
141 Object.defineProperty(this, "argsLength", {
142 enumerable: true,
143 configurable: true,
144 writable: true,
145 value: -1
146 });
147 Object.defineProperty(this, "last", {
148 enumerable: true,
149 configurable: true,
150 writable: true,
151 value: void 0
152 });
153 }
154 Object.defineProperty(DeepMap.prototype, "entry", {
155 enumerable: false,
156 configurable: true,
157 writable: true,
158 value: function (args) {
159 if (this.argsLength === -1)
160 this.argsLength = args.length;
161 else if (this.argsLength !== args.length)
162 throw new Error("DeepMap should be used with functions with a consistent length, expected: " + this.argsLength + ", got: " + args.length);
163 if (this.last)
164 this.last.isDisposed = true;
165 return (this.last = new DeepMapEntry(this.store, args));
166 }
167 });
168 return DeepMap;
169}());
170export { DeepMap };