@blackglory/structures 0.11.6 → 0.11.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +61 -0
  2. package/lib/es2015/dynamic-typed-array.d.ts +1 -0
  3. package/lib/es2015/dynamic-typed-array.js +10 -0
  4. package/lib/es2015/dynamic-typed-array.js.map +1 -1
  5. package/lib/es2015/index.d.ts +3 -0
  6. package/lib/es2015/index.js +6 -1
  7. package/lib/es2015/index.js.map +1 -1
  8. package/lib/es2015/radix-tree.d.ts +17 -0
  9. package/lib/es2015/radix-tree.js +221 -0
  10. package/lib/es2015/radix-tree.js.map +1 -0
  11. package/lib/es2015/string-radix-tree.d.ts +17 -0
  12. package/lib/es2015/string-radix-tree.js +221 -0
  13. package/lib/es2015/string-radix-tree.js.map +1 -0
  14. package/lib/es2015/string-trie-map.d.ts +11 -0
  15. package/lib/es2015/string-trie-map.js +96 -0
  16. package/lib/es2015/string-trie-map.js.map +1 -0
  17. package/lib/es2015/trie-map.js +20 -20
  18. package/lib/es2015/trie-map.js.map +1 -1
  19. package/lib/es2018/dynamic-typed-array.d.ts +1 -0
  20. package/lib/es2018/dynamic-typed-array.js +10 -0
  21. package/lib/es2018/dynamic-typed-array.js.map +1 -1
  22. package/lib/es2018/index.d.ts +3 -0
  23. package/lib/es2018/index.js +6 -1
  24. package/lib/es2018/index.js.map +1 -1
  25. package/lib/es2018/radix-tree.d.ts +17 -0
  26. package/lib/es2018/radix-tree.js +221 -0
  27. package/lib/es2018/radix-tree.js.map +1 -0
  28. package/lib/es2018/string-radix-tree.d.ts +17 -0
  29. package/lib/es2018/string-radix-tree.js +221 -0
  30. package/lib/es2018/string-radix-tree.js.map +1 -0
  31. package/lib/es2018/string-trie-map.d.ts +11 -0
  32. package/lib/es2018/string-trie-map.js +96 -0
  33. package/lib/es2018/string-trie-map.js.map +1 -0
  34. package/lib/es2018/trie-map.js +20 -20
  35. package/lib/es2018/trie-map.js.map +1 -1
  36. package/package.json +8 -9
package/README.md CHANGED
@@ -265,6 +265,66 @@ class TrieMap<K extends Iterable<T>, V, T = unknown> {
265
265
  }
266
266
  ```
267
267
 
268
+ Note that you might expect this data structure to be more space efficient than `BigMap`, but it doesn't.
269
+ In V8, it can only store about 80% of data of `BigMap`.
270
+
271
+ ### StringTrieMap
272
+ ```ts
273
+ class StringTrieMap<T> {
274
+ get [Symbol.toStringTag](): string
275
+
276
+ keys(): IterableIterator<string>
277
+ values(): IterableIterator<T>
278
+ entries(): IterableIterator<[key: string, value: T]>
279
+
280
+ set(key: string, value: T): this
281
+ has(key: string): boolean
282
+ get(key: string): T | undefined
283
+ delete(key: string): boolean
284
+ }
285
+ ```
286
+
287
+ Note that you might expect this data structure to be more space efficient than `BigMap`, but it doesn't.
288
+ In V8, it can only store about 80% of data of `BigMap`.
289
+
290
+ ### RadixTree
291
+ ```ts
292
+ class RadixTree<K extends Iterable<T>, V, T = unknown> {
293
+ get [Symbol.toStringTag](): string
294
+
295
+ entries(): IterableIterator<[key: T[], value: V]>
296
+ keys(): IterableIterator<T[]>
297
+ values(): IterableIterator<V>
298
+
299
+ set(key: K, value: V): this
300
+ has(key: K): boolean
301
+ get(key: K): V | undefined
302
+ delete(key: K): boolean
303
+ }
304
+ ```
305
+
306
+ Note that you might expect this data structure to be more space efficient than `BigMap`, but it doesn't.
307
+ In V8, it can only store about 80% of data of `BigMap`.
308
+
309
+ ### StringRadixTree
310
+ ```ts
311
+ class StringRadixTree<T> {
312
+ get [Symbol.toStringTag](): string
313
+
314
+ keys(): IterableIterator<string>
315
+ values(): IterableIterator<T>
316
+ entries(): IterableIterator<[key: string, value: T]>
317
+
318
+ set(key: string, value: T): this
319
+ has(key: string): boolean
320
+ get(key: string): T | undefined
321
+ delete(key: string): boolean
322
+ }
323
+ ```
324
+
325
+ Note that you might expect this data structure to be more space efficient than `BigMap`, but it doesn't.
326
+ In V8, it can only store about 80% of data of `BigMap`.
327
+
268
328
  ### SparseSet
269
329
  ```ts
270
330
  class SparseSet implements Iterable<number> {
@@ -334,6 +394,7 @@ class DynamicTypedArray<T extends TypedArrayConstructor> {
334
394
  )
335
395
 
336
396
  set(index: number, value: number): void
397
+ setValues(index: number, values: TypedArrayOfConstructor<T>): void
337
398
  get(index: number): number | undefined
338
399
  push(...values: number[]): void
339
400
  pop(): number | undefined
@@ -15,6 +15,7 @@ export declare class DynamicTypedArray<T extends TypedArrayConstructor> {
15
15
  get length(): number;
16
16
  constructor(typedArrayConstructor: T, { capacity, growthFactor }?: IDynamicTypedArrayOptions);
17
17
  set(index: number, value: number): void;
18
+ setValues(index: number, values: TypedArrayOfConstructor<T>): void;
18
19
  get(index: number): number | undefined;
19
20
  push(...values: number[]): void;
20
21
  pop(): number | undefined;
@@ -37,6 +37,16 @@ class DynamicTypedArray {
37
37
  }
38
38
  this.array[index] = value;
39
39
  }
40
+ setValues(index, values) {
41
+ if (index + values.length >= this.capacity) {
42
+ const newCapacity = computeNewCapacity(this.capacity, index + values.length, this.growthFactor);
43
+ this.resize(newCapacity);
44
+ }
45
+ if (index + values.length > this._length) {
46
+ this._length = index + values.length;
47
+ }
48
+ this.internalTypedArray.set(values, index);
49
+ }
40
50
  get(index) {
41
51
  return index < this._length
42
52
  ? this.array[index]
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-typed-array.js","sourceRoot":"","sources":["../../src/dynamic-typed-array.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dynamic-typed-array.js","sourceRoot":"","sources":["../../src/dynamic-typed-array.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,9 @@ export * from './lru-map';
11
11
  export * from './expirable-map';
12
12
  export * from './tlru-map';
13
13
  export * from './trie-map';
14
+ export * from './string-trie-map';
15
+ export { RadixTree } from './radix-tree';
16
+ export { StringRadixTree } from './string-radix-tree';
14
17
  export * from './sparse-set';
15
18
  export * from './sparse-map';
16
19
  export * from './typed-sparse-map';
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.DynamicTypedArray = void 0;
17
+ exports.DynamicTypedArray = exports.StringRadixTree = exports.RadixTree = void 0;
18
18
  __exportStar(require("./box"), exports);
19
19
  __exportStar(require("./cons"), exports);
20
20
  __exportStar(require("./array"), exports);
@@ -28,6 +28,11 @@ __exportStar(require("./lru-map"), exports);
28
28
  __exportStar(require("./expirable-map"), exports);
29
29
  __exportStar(require("./tlru-map"), exports);
30
30
  __exportStar(require("./trie-map"), exports);
31
+ __exportStar(require("./string-trie-map"), exports);
32
+ var radix_tree_1 = require("./radix-tree");
33
+ Object.defineProperty(exports, "RadixTree", { enumerable: true, get: function () { return radix_tree_1.RadixTree; } });
34
+ var string_radix_tree_1 = require("./string-radix-tree");
35
+ Object.defineProperty(exports, "StringRadixTree", { enumerable: true, get: function () { return string_radix_tree_1.StringRadixTree; } });
31
36
  __exportStar(require("./sparse-set"), exports);
32
37
  __exportStar(require("./sparse-map"), exports);
33
38
  __exportStar(require("./typed-sparse-map"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wCAAqB;AACrB,yCAAsB;AACtB,0CAAuB;AACvB,4CAAyB;AACzB,4CAAyB;AACzB,4CAAyB;AACzB,6CAA0B;AAC1B,6CAA0B;AAC1B,0CAAuB;AACvB,4CAAyB;AACzB,kDAA+B;AAC/B,6CAA0B;AAC1B,6CAA0B;AAC1B,+CAA4B;AAC5B,+CAA4B;AAC5B,qDAAkC;AAClC,qDAAkC;AAClC,6DAAyD;AAAhD,wHAAA,iBAAiB,OAAA;AAC1B,+CAA4B;AAC5B,4CAAyB;AACzB,kDAA+B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wCAAqB;AACrB,yCAAsB;AACtB,0CAAuB;AACvB,4CAAyB;AACzB,4CAAyB;AACzB,4CAAyB;AACzB,6CAA0B;AAC1B,6CAA0B;AAC1B,0CAAuB;AACvB,4CAAyB;AACzB,kDAA+B;AAC/B,6CAA0B;AAC1B,6CAA0B;AAC1B,oDAAiC;AACjC,2CAAwC;AAA/B,uGAAA,SAAS,OAAA;AAClB,yDAAqD;AAA5C,oHAAA,eAAe,OAAA;AACxB,+CAA4B;AAC5B,+CAA4B;AAC5B,qDAAkC;AAClC,qDAAkC;AAClC,6DAAyD;AAAhD,wHAAA,iBAAiB,OAAA;AAC1B,+CAA4B;AAC5B,4CAAyB;AACzB,kDAA+B"}
@@ -0,0 +1,17 @@
1
+ export declare class RadixTree<K extends Iterable<T>, V, T = unknown> {
2
+ private root;
3
+ get [Symbol.toStringTag](): string;
4
+ entries(): IterableIterator<[key: T[], value: V]>;
5
+ keys(): IterableIterator<T[]>;
6
+ values(): IterableIterator<V>;
7
+ set(key: K, value: V): this;
8
+ has(key: K): boolean;
9
+ get(key: K): V | undefined;
10
+ delete(key: K): boolean;
11
+ }
12
+ export declare function matchPrefix<T>(prefixes: Iterable<T[]>, path: T[]): T[] | undefined;
13
+ export declare function findCommonPrefix<T>(prefixes: Iterable<T[]>, path: T[]): {
14
+ prefix: T[];
15
+ commonPartLength: number;
16
+ } | undefined;
17
+ export declare function getCommonPrefix<T>(paths: T[][]): T[];
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCommonPrefix = exports.findCommonPrefix = exports.matchPrefix = exports.RadixTree = void 0;
4
+ const iterable_operator_1 = require("iterable-operator");
5
+ const extra_utils_1 = require("extra-utils");
6
+ class TreeNode {
7
+ constructor(value) {
8
+ this.value = value;
9
+ this.children = new Map();
10
+ }
11
+ }
12
+ class RadixTree {
13
+ constructor() {
14
+ this.root = new TreeNode();
15
+ }
16
+ get [Symbol.toStringTag]() {
17
+ return this.constructor.name;
18
+ }
19
+ entries() {
20
+ return dfs(this.root, []);
21
+ function* dfs(node, path) {
22
+ for (const [prefix, childNode] of node.children) {
23
+ const newPath = [...path, ...prefix];
24
+ if ((0, extra_utils_1.isntUndefined)(childNode.value)) {
25
+ yield [newPath, childNode.value];
26
+ }
27
+ yield* dfs(childNode, newPath);
28
+ }
29
+ }
30
+ }
31
+ keys() {
32
+ return (0, iterable_operator_1.map)(this.entries(), ([key]) => key);
33
+ }
34
+ values() {
35
+ return (0, iterable_operator_1.map)(this.entries(), ([, value]) => value);
36
+ }
37
+ set(key, value) {
38
+ set((0, iterable_operator_1.toArray)(key), value, this.root);
39
+ return this;
40
+ function set(key, value, node) {
41
+ const commonPrefix = findCommonPrefix(node.children.keys(), key);
42
+ if ((0, extra_utils_1.isntUndefined)(commonPrefix)) {
43
+ const { prefix, commonPartLength } = commonPrefix;
44
+ if (prefix.length === commonPartLength) {
45
+ const prefixNode = node.children.get(prefix);
46
+ if (key.length === prefix.length) {
47
+ prefixNode.value = value;
48
+ }
49
+ else {
50
+ const newKey = key.slice(prefix.length);
51
+ set(newKey, value, prefixNode);
52
+ }
53
+ }
54
+ else {
55
+ const oldPrefixNode = node.children.get(prefix);
56
+ const commonPrefix = prefix.slice(0, commonPartLength);
57
+ const newPrefixNode = new TreeNode();
58
+ node.children.set(commonPrefix, newPrefixNode);
59
+ newPrefixNode.children.set(prefix.slice(commonPartLength), oldPrefixNode);
60
+ newPrefixNode.children.set(key.slice(commonPartLength), new TreeNode(value));
61
+ node.children.delete(prefix);
62
+ }
63
+ }
64
+ else {
65
+ node.children.set(key, new TreeNode(value));
66
+ }
67
+ }
68
+ }
69
+ has(key) {
70
+ return has((0, iterable_operator_1.toArray)(key), this.root);
71
+ function has(key, node) {
72
+ const matchedPrefix = matchPrefix(node.children.keys(), key);
73
+ if ((0, extra_utils_1.isntUndefined)(matchedPrefix)) {
74
+ const restKey = key.slice(matchedPrefix.length);
75
+ if (restKey.length === 0) {
76
+ return true;
77
+ }
78
+ else {
79
+ return has(restKey, node.children.get(matchedPrefix));
80
+ }
81
+ }
82
+ else {
83
+ return false;
84
+ }
85
+ }
86
+ }
87
+ get(key) {
88
+ return get((0, iterable_operator_1.toArray)(key), this.root);
89
+ function get(key, node) {
90
+ const matchedPrefix = matchPrefix(node.children.keys(), key);
91
+ if ((0, extra_utils_1.isntUndefined)(matchedPrefix)) {
92
+ const restKey = key.slice(matchedPrefix.length);
93
+ const nextNode = node.children.get(matchedPrefix);
94
+ if (restKey.length === 0) {
95
+ return nextNode.value;
96
+ }
97
+ else {
98
+ return get(restKey, nextNode);
99
+ }
100
+ }
101
+ else {
102
+ return undefined;
103
+ }
104
+ }
105
+ }
106
+ delete(key) {
107
+ return _delete((0, iterable_operator_1.toArray)(key), this.root);
108
+ function _delete(key, node) {
109
+ const matchedPrefix = matchPrefix(node.children.keys(), key);
110
+ if ((0, extra_utils_1.isntUndefined)(matchedPrefix)) {
111
+ if (key.length === matchedPrefix.length) {
112
+ const targetNode = node.children.get(matchedPrefix);
113
+ if (targetNode.children.size === 0) {
114
+ node.children.delete(matchedPrefix);
115
+ }
116
+ else {
117
+ delete node.value;
118
+ if (targetNode.children.size === 1) {
119
+ const [key, value] = (0, iterable_operator_1.first)(targetNode.children.entries());
120
+ node.children.set([...matchedPrefix, ...key], value);
121
+ node.children.delete(matchedPrefix);
122
+ }
123
+ }
124
+ return true;
125
+ }
126
+ else {
127
+ const nextNode = node.children.get(matchedPrefix);
128
+ const nextKey = key.slice(matchedPrefix.length);
129
+ const deleted = _delete(nextKey, nextNode);
130
+ if (deleted) {
131
+ if (!('value' in nextNode)) {
132
+ switch (nextNode.children.size) {
133
+ case 0: {
134
+ node.children.delete(matchedPrefix);
135
+ break;
136
+ }
137
+ case 1: {
138
+ const [key, value] = (0, iterable_operator_1.first)(nextNode.children.entries());
139
+ node.children.set([...matchedPrefix, ...key], value);
140
+ node.children.delete(matchedPrefix);
141
+ break;
142
+ }
143
+ default: {
144
+ const entries = (0, iterable_operator_1.toArray)(nextNode.children.entries());
145
+ const keys = entries.map(([key]) => key);
146
+ const commonPrefix = getCommonPrefix(keys);
147
+ if (commonPrefix) {
148
+ const newPrefix = [...matchedPrefix, ...commonPrefix];
149
+ const childNode = new TreeNode();
150
+ for (const [key, value] of entries) {
151
+ childNode.children.set(key.slice(commonPrefix.length), value);
152
+ }
153
+ node.children.set(newPrefix, childNode);
154
+ node.children.delete(matchedPrefix);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ return true;
160
+ }
161
+ else {
162
+ return false;
163
+ }
164
+ }
165
+ }
166
+ else {
167
+ return false;
168
+ }
169
+ }
170
+ }
171
+ }
172
+ exports.RadixTree = RadixTree;
173
+ function matchPrefix(prefixes, path) {
174
+ return (0, iterable_operator_1.find)(prefixes, prefix => path[0] === prefix[0]);
175
+ }
176
+ exports.matchPrefix = matchPrefix;
177
+ function findCommonPrefix(prefixes, path) {
178
+ for (const prefix of prefixes) {
179
+ let commonPartLength = 0;
180
+ for (let i = 0; i < prefix.length; i++) {
181
+ if (path[i] === prefix[i]) {
182
+ commonPartLength++;
183
+ }
184
+ else {
185
+ if (commonPartLength > 0) {
186
+ return { prefix, commonPartLength };
187
+ }
188
+ }
189
+ }
190
+ if (commonPartLength > 0) {
191
+ return { prefix, commonPartLength };
192
+ }
193
+ }
194
+ }
195
+ exports.findCommonPrefix = findCommonPrefix;
196
+ function getCommonPrefix(paths) {
197
+ if (paths.length > 0) {
198
+ const commonPrefix = [];
199
+ loop: for (let elementIndex = 0, firstPathLength = paths[0].length; elementIndex < firstPathLength; elementIndex++) {
200
+ const element = paths[0][elementIndex];
201
+ for (let pathIndex = 1; pathIndex < paths.length; pathIndex++) {
202
+ const path = paths[pathIndex];
203
+ if (elementIndex < path.length) {
204
+ if (path[elementIndex] !== element) {
205
+ break loop;
206
+ }
207
+ }
208
+ else {
209
+ break loop;
210
+ }
211
+ }
212
+ commonPrefix.push(element);
213
+ }
214
+ return commonPrefix;
215
+ }
216
+ else {
217
+ return [];
218
+ }
219
+ }
220
+ exports.getCommonPrefix = getCommonPrefix;
221
+ //# sourceMappingURL=radix-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radix-tree.js","sourceRoot":"","sources":["../../src/radix-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare class StringRadixTree<T> {
2
+ private root;
3
+ get [Symbol.toStringTag](): string;
4
+ entries(): IterableIterator<[key: string, value: T]>;
5
+ keys(): IterableIterator<string>;
6
+ values(): IterableIterator<T>;
7
+ set(key: string, value: T): this;
8
+ has(key: string): boolean;
9
+ get(key: string): T | undefined;
10
+ delete(key: string): boolean;
11
+ }
12
+ export declare function matchPrefix(prefixes: Iterable<string>, path: string): string | undefined;
13
+ export declare function findCommonPrefix(prefixes: Iterable<string>, path: string): {
14
+ prefix: string;
15
+ commonPartLength: number;
16
+ } | undefined;
17
+ export declare function getCommonPrefix(paths: string[]): string;
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCommonPrefix = exports.findCommonPrefix = exports.matchPrefix = exports.StringRadixTree = void 0;
4
+ const iterable_operator_1 = require("iterable-operator");
5
+ const extra_utils_1 = require("extra-utils");
6
+ class TreeNode {
7
+ constructor(value) {
8
+ this.value = value;
9
+ this.children = new Map();
10
+ }
11
+ }
12
+ class StringRadixTree {
13
+ constructor() {
14
+ this.root = new TreeNode();
15
+ }
16
+ get [Symbol.toStringTag]() {
17
+ return this.constructor.name;
18
+ }
19
+ entries() {
20
+ return dfs(this.root, '');
21
+ function* dfs(node, path) {
22
+ for (const [prefix, childNode] of node.children) {
23
+ const newPath = path + prefix;
24
+ if ((0, extra_utils_1.isntUndefined)(childNode.value)) {
25
+ yield [newPath, childNode.value];
26
+ }
27
+ yield* dfs(childNode, newPath);
28
+ }
29
+ }
30
+ }
31
+ keys() {
32
+ return (0, iterable_operator_1.map)(this.entries(), ([key]) => key);
33
+ }
34
+ values() {
35
+ return (0, iterable_operator_1.map)(this.entries(), ([, value]) => value);
36
+ }
37
+ set(key, value) {
38
+ set(key, value, this.root);
39
+ return this;
40
+ function set(key, value, node) {
41
+ const commonPrefix = findCommonPrefix(node.children.keys(), key);
42
+ if ((0, extra_utils_1.isntUndefined)(commonPrefix)) {
43
+ const { prefix, commonPartLength } = commonPrefix;
44
+ if (prefix.length === commonPartLength) {
45
+ const prefixNode = node.children.get(prefix);
46
+ if (key.length === prefix.length) {
47
+ prefixNode.value = value;
48
+ }
49
+ else {
50
+ const newKey = key.slice(prefix.length);
51
+ set(newKey, value, prefixNode);
52
+ }
53
+ }
54
+ else {
55
+ const oldPrefixNode = node.children.get(prefix);
56
+ const commonPrefix = prefix.slice(0, commonPartLength);
57
+ const newPrefixNode = new TreeNode();
58
+ node.children.set(commonPrefix, newPrefixNode);
59
+ newPrefixNode.children.set(prefix.slice(commonPartLength), oldPrefixNode);
60
+ newPrefixNode.children.set(key.slice(commonPartLength), new TreeNode(value));
61
+ node.children.delete(prefix);
62
+ }
63
+ }
64
+ else {
65
+ node.children.set(key, new TreeNode(value));
66
+ }
67
+ }
68
+ }
69
+ has(key) {
70
+ return has(key, this.root);
71
+ function has(key, node) {
72
+ const matchedPrefix = matchPrefix(node.children.keys(), key);
73
+ if ((0, extra_utils_1.isntUndefined)(matchedPrefix)) {
74
+ const restKey = key.slice(matchedPrefix.length);
75
+ if (restKey.length === 0) {
76
+ return true;
77
+ }
78
+ else {
79
+ return has(restKey, node.children.get(matchedPrefix));
80
+ }
81
+ }
82
+ else {
83
+ return false;
84
+ }
85
+ }
86
+ }
87
+ get(key) {
88
+ return get(key, this.root);
89
+ function get(key, node) {
90
+ const matchedPrefix = matchPrefix(node.children.keys(), key);
91
+ if ((0, extra_utils_1.isntUndefined)(matchedPrefix)) {
92
+ const restKey = key.slice(matchedPrefix.length);
93
+ const nextNode = node.children.get(matchedPrefix);
94
+ if (restKey.length === 0) {
95
+ return nextNode.value;
96
+ }
97
+ else {
98
+ return get(restKey, nextNode);
99
+ }
100
+ }
101
+ else {
102
+ return undefined;
103
+ }
104
+ }
105
+ }
106
+ delete(key) {
107
+ return _delete(key, this.root);
108
+ function _delete(key, node) {
109
+ const matchedPrefix = matchPrefix(node.children.keys(), key);
110
+ if ((0, extra_utils_1.isntUndefined)(matchedPrefix)) {
111
+ if (key.length === matchedPrefix.length) {
112
+ const targetNode = node.children.get(matchedPrefix);
113
+ if (targetNode.children.size === 0) {
114
+ node.children.delete(matchedPrefix);
115
+ }
116
+ else {
117
+ delete node.value;
118
+ if (targetNode.children.size === 1) {
119
+ const [key, value] = (0, iterable_operator_1.first)(targetNode.children.entries());
120
+ node.children.set(matchedPrefix + key, value);
121
+ node.children.delete(matchedPrefix);
122
+ }
123
+ }
124
+ return true;
125
+ }
126
+ else {
127
+ const nextNode = node.children.get(matchedPrefix);
128
+ const nextKey = key.slice(matchedPrefix.length);
129
+ const deleted = _delete(nextKey, nextNode);
130
+ if (deleted) {
131
+ if (!('value' in nextNode)) {
132
+ switch (nextNode.children.size) {
133
+ case 0: {
134
+ node.children.delete(matchedPrefix);
135
+ break;
136
+ }
137
+ case 1: {
138
+ const [key, value] = (0, iterable_operator_1.first)(nextNode.children.entries());
139
+ node.children.set(matchedPrefix + key, value);
140
+ node.children.delete(matchedPrefix);
141
+ break;
142
+ }
143
+ default: {
144
+ const entries = (0, iterable_operator_1.toArray)(nextNode.children.entries());
145
+ const keys = entries.map(([key]) => key);
146
+ const commonPrefix = getCommonPrefix(keys);
147
+ if (commonPrefix) {
148
+ const newPrefix = matchedPrefix + commonPrefix;
149
+ const childNode = new TreeNode();
150
+ for (const [key, value] of entries) {
151
+ childNode.children.set(key.slice(commonPrefix.length), value);
152
+ }
153
+ node.children.set(newPrefix, childNode);
154
+ node.children.delete(matchedPrefix);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ return true;
160
+ }
161
+ else {
162
+ return false;
163
+ }
164
+ }
165
+ }
166
+ else {
167
+ return false;
168
+ }
169
+ }
170
+ }
171
+ }
172
+ exports.StringRadixTree = StringRadixTree;
173
+ function matchPrefix(prefixes, path) {
174
+ return (0, iterable_operator_1.find)(prefixes, prefix => path.startsWith(prefix));
175
+ }
176
+ exports.matchPrefix = matchPrefix;
177
+ function findCommonPrefix(prefixes, path) {
178
+ for (const prefix of prefixes) {
179
+ let commonPartLength = 0;
180
+ for (let i = 0; i < prefix.length; i++) {
181
+ if (path[i] === prefix[i]) {
182
+ commonPartLength++;
183
+ }
184
+ else {
185
+ if (commonPartLength > 0) {
186
+ return { prefix, commonPartLength };
187
+ }
188
+ }
189
+ }
190
+ if (commonPartLength > 0) {
191
+ return { prefix, commonPartLength };
192
+ }
193
+ }
194
+ }
195
+ exports.findCommonPrefix = findCommonPrefix;
196
+ function getCommonPrefix(paths) {
197
+ if (paths.length > 0) {
198
+ const commonPrefix = [];
199
+ loop: for (let charIndex = 0, firstPathLength = paths[0].length; charIndex < firstPathLength; charIndex++) {
200
+ const char = paths[0][charIndex];
201
+ for (let pathIndex = 1; pathIndex < paths.length; pathIndex++) {
202
+ const path = paths[pathIndex];
203
+ if (charIndex < path.length) {
204
+ if (path[charIndex] !== char) {
205
+ break loop;
206
+ }
207
+ }
208
+ else {
209
+ break loop;
210
+ }
211
+ }
212
+ commonPrefix.push(char);
213
+ }
214
+ return commonPrefix.join('');
215
+ }
216
+ else {
217
+ return '';
218
+ }
219
+ }
220
+ exports.getCommonPrefix = getCommonPrefix;
221
+ //# sourceMappingURL=string-radix-tree.js.map