1 |
|
2 |
|
3 |
|
4 | var DeepMapEntry = (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 |
|
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 |
|
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 |
|
123 | if (this.isDisposed)
|
124 | throw new Error("Concurrent modification exception");
|
125 | }
|
126 | });
|
127 | return DeepMapEntry;
|
128 | }());
|
129 | export { DeepMapEntry };
|
130 |
|
131 |
|
132 |
|
133 | var DeepMap = (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 | }());
|
170 | export { DeepMap };
|