use std::collections::HashMap;
pub struct TrieNode<'a, T> {
children: HashMap<&'a str, TrieNode<'a, T>>,
data: Option<T>,
}
impl<'a, T> Default for TrieNode<'a, T> {
fn default() -> Self {
Self {
children: HashMap::new(),
data: None,
}
}
}
pub struct Trie<'a, T> {
root: TrieNode<'a, T>,
}
impl<'a, T> Default for Trie<'a, T> {
fn default() -> Self {
Self::new()
}
}
impl<'a, T> Trie<'a, T> {
pub fn new() -> Self {
Self {
root: TrieNode::default(),
}
}
pub fn insert(&mut self, path: Vec<&'a str>, data: T) {
let mut node = &mut self.root;
for key in path.iter() {
node = node.children.entry(key).or_default();
}
node.data = Some(data);
}
pub fn find_longest_match(&'a self, request_path: Vec<&'a str>) -> Option<&T> {
let mut node = &self.root;
let mut last_matched_data: Option<&T> = None;
for key in request_path.iter() {
if let Some(next_node) = node.children.get(key) {
node = next_node;
if node.data.is_some() {
last_matched_data = node.data.as_ref();
}
} else {
break;
}
}
last_matched_data
}
}