forked from jacobparis-insiders/remix-custom-routes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPrefixLookupTrie.js
47 lines (42 loc) · 1.12 KB
/
PrefixLookupTrie.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
const PrefixLookupTrieEndSymbol = Symbol("PrefixLookupTrieEndSymbol")
class PrefixLookupTrie {
constructor() {
this.root = {
[PrefixLookupTrieEndSymbol]: false,
}
}
add(value) {
if (!value) throw new Error("Cannot add empty string to PrefixLookupTrie")
let node = this.root
for (const char of value) {
if (!node[char]) {
node[char] = {
[PrefixLookupTrieEndSymbol]: false,
}
}
node = node[char]
}
node[PrefixLookupTrieEndSymbol] = true
}
findAndRemove(prefix, filter) {
let node = this.root
for (const char of prefix) {
if (!node[char]) return []
node = node[char]
}
return this.#findAndRemoveRecursive([], node, prefix, filter)
}
#findAndRemoveRecursive(values, node, prefix, filter) {
for (const char of Object.keys(node)) {
this.#findAndRemoveRecursive(values, node[char], prefix + char, filter)
}
if (node[PrefixLookupTrieEndSymbol] && filter(prefix)) {
node[PrefixLookupTrieEndSymbol] = false
values.push(prefix)
}
return values
}
}
module.exports = {
PrefixLookupTrie,
}