1use std::sync::Arc;
3use serde::{Serialize, Deserialize};
4use crate::matcher::{MatchType, StateSequence};
5
6pub trait KeyPrefix {
8
9 fn key_chars(&self) -> Vec<char>;
10
11 fn key_len(&self) -> usize;
12
13 fn empty() -> Self;
14
15 fn new_from_key_prefix(&self, index: usize) -> Self;
16
17 fn new_from_postfix(&self, index: usize) -> Self;
18
19 #[inline]
20 fn compiled(&self) -> Vec<Arc<StateSequence>> {
21 let mut state_seq = Vec::new();
22 let mut buff: Vec<char> = Vec::new();
23 for ch in self.key_chars() {
24 buff.push(ch);
25 }
26 if !buff.is_empty() {
27 state_seq.push(Arc::new(StateSequence {
28 match_type: MatchType::Literal,
29 sequence: buff,
30 }));
31 }
32 state_seq
33 }
34}
35
36#[derive(Clone, Debug, Serialize, Deserialize)]
37pub struct TrieKey<K> {
38 pub(crate) key: K,
39 pub(crate) seq: Vec<Arc<StateSequence>>,
40}
41
42impl <K: KeyPrefix> TrieKey<K> {
43
44 #[inline]
45 pub fn new(key: K) -> Self {
46 Self {
47 seq: key.compiled(),
48 key,
49 }
50 }
51
52 #[inline]
53 pub fn is_empty(&self) -> bool {
54 self.seq.is_empty()
55 }
56
57 #[inline]
58 pub fn lcp(&self, other: &Self) -> (usize, bool, bool) {
59 let mut lcp = 0;
60 let w0l = self.key.key_len();
61 let w1l = other.key.key_len();
62 let mlen = std::cmp::min(w0l, w1l);
63 let mut w0i = self.key.key_chars().into_iter();
64 let mut w1i = other.key.key_chars().into_iter();
65 let mut preceeding = true;
66 for _ in 0 .. mlen {
67 let char0 = w0i.next().unwrap();
68 let char1 = w1i.next().unwrap();
69 if char0.eq(&char1) {
70 lcp += 1;
71 }
72 else {
73 if char1.lt(&char0) {
74 preceeding = false;
75 }
76 break;
77 }
78 }
79 let full_match = w0l == w1l && lcp == w0l;
80 (lcp, preceeding, full_match)
81 }
82}
83
84impl KeyPrefix for String {
85
86 #[inline]
87 fn key_chars(&self) -> Vec<char> {
88 self.chars().into_iter().collect()
89 }
90
91 #[inline]
92 fn key_len(&self) -> usize {
93 self.len()
94 }
95
96 #[inline]
97 fn empty() -> Self {
98 String::new()
99 }
100
101 #[inline]
102 fn new_from_key_prefix(&self, index: usize) -> Self {
103 self[..index].to_string()
104 }
105
106 #[inline]
107 fn new_from_postfix(&self, index: usize) -> Self {
108 self[index..].to_string()
109 }
110}
111
112pub trait ValueMerge {
113 fn merge(&self, other: &Self) -> Self;
114
115 fn merge_mut(&mut self, other: &Self);
116}