pub struct Interner<T> {
interned: Vec<T>,
}
impl<T: Eq + Clone> Interner<T> {
pub fn new() -> Interner<T> {
Interner { interned: vec![] }
}
pub fn intern(&mut self, s: impl Into<T>) -> usize {
let value = s.into();
for (index, interned) in self.interned.iter().enumerate() {
if &value == interned {
return index;
}
}
self.interned.push(value);
self.interned.len() - 1
}
pub fn lookup(&mut self, index: usize) -> Option<&T> {
self.interned.get(index)
}
pub fn count(&self) -> usize {
self.interned.len()
}
}
impl<T: Eq + Clone> Default for Interner<T> {
fn default() -> Self {
Self::new()
}
}