UNPKG

3.17 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const lodash_1 = require("lodash");
4class PrefixMap {
5 constructor() {
6 this.prefixes = [];
7 this.items = {};
8 }
9 keys() { return this.prefixes; }
10 size() { return this.prefixes.length; }
11 resolve(key) {
12 const prefix = this.resolvePrefix(key);
13 return typeof prefix !== 'undefined' ? this.items[prefix] : undefined;
14 }
15 resolvePrefix(key) {
16 if (this.items[key])
17 return key;
18 const index = lodash_1.findIndex(this.prefixes, (e) => key.startsWith(e + '.'));
19 if (index === -1)
20 return undefined;
21 const prefix = this.prefixes[index];
22 return prefix;
23 }
24 get(prefix) { return this.items[prefix]; }
25 *getKeysStartingWith(prefix) {
26 const predicate = (key) => key.startsWith(prefix);
27 let index = -1;
28 while ((index = lodash_1.findIndex(this.prefixes, predicate, index + 1)) !== -1) {
29 yield this.prefixes[index];
30 }
31 }
32 *getKeysPrefixesOf(search) {
33 const predicate = (key) => search.startsWith(key + '.');
34 let index = -1;
35 while ((index = lodash_1.findIndex(this.prefixes, predicate, index + 1)) !== -1) {
36 yield this.prefixes[index];
37 }
38 }
39 each(fn) {
40 for (const prefix of this.prefixes) {
41 fn(this.items[prefix], prefix);
42 }
43 }
44 insert(prefix, item) {
45 if (!this.items[prefix]) {
46 const index = lodash_1.findIndex(this.prefixes, (e) => {
47 if (prefix.length === e.length) {
48 return prefix > e;
49 }
50 return prefix.length > e.length;
51 });
52 if (index === -1) {
53 this.prefixes.push(prefix);
54 }
55 else {
56 this.prefixes.splice(index, 0, prefix);
57 }
58 }
59 this.items[prefix] = item;
60 return item;
61 }
62 delete(prefix) {
63 const index = this.prefixes.indexOf(prefix);
64 if (this.prefixes[index] === prefix)
65 this.prefixes.splice(index, 1);
66 delete this.items[prefix];
67 }
68 toJSON() {
69 return this.items;
70 }
71 getShortestUnambiguousPrefix(address, prefix = '') {
72 if (!address.startsWith(prefix)) {
73 throw new Error(`address must start with prefix. address=${address} prefix=${prefix}`);
74 }
75 this.keys().forEach((secondPrefix) => {
76 if (secondPrefix === prefix) {
77 return;
78 }
79 while (secondPrefix.startsWith(prefix)) {
80 if (secondPrefix === prefix) {
81 return;
82 }
83 const nextSegmentEnd = address.indexOf('.', prefix.length + 1);
84 if (nextSegmentEnd === -1) {
85 prefix = address;
86 return;
87 }
88 else {
89 prefix = address.slice(0, nextSegmentEnd);
90 }
91 }
92 });
93 return prefix;
94 }
95}
96exports.default = PrefixMap;
97//# sourceMappingURL=prefix-map.js.map
\No newline at end of file