1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const lodash_1 = require("lodash");
|
4 | class 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 | }
|
96 | exports.default = PrefixMap;
|
97 |
|
\ | No newline at end of file |