pub struct RegexMap<V> {
set: regex::bytes::RegexSet,
values: Vec<V>,
}
impl<V> RegexMap<V> {
pub fn new<I, S>(items: I) -> Self
where
I: IntoIterator<Item = (S, V)>,
S: AsRef<str>,
{
let mut exprs = Vec::new();
let mut values = Vec::new();
for (expr, value) in items {
exprs.push(expr);
values.push(value);
}
let set = regex::bytes::RegexSet::new(exprs).unwrap();
RegexMap { set, values }
}
pub fn get(&self, key: &[u8]) -> impl Iterator<Item = &V> {
self.set
.matches(key)
.into_iter()
.map(move |i| &self.values[i])
}
pub fn contains_key(&self, key: &[u8]) -> bool {
self.set.is_match(key)
}
}