nova_interpreter/utils/
interner.rs

1pub struct Interner<T> {
2    interned: Vec<T>,
3}
4
5impl<T: Eq + Clone> Interner<T> {
6    pub fn new() -> Interner<T> {
7        Interner { interned: vec![] }
8    }
9
10    pub fn intern(&mut self, s: impl Into<T>) -> usize {
11        let value = s.into();
12        for (index, interned) in self.interned.iter().enumerate() {
13            if &value == interned {
14                return index;
15            }
16        }
17
18        self.interned.push(value);
19
20        self.interned.len() - 1
21    }
22
23    pub fn lookup(&mut self, index: usize) -> Option<&T> {
24        self.interned.get(index)
25    }
26
27    pub fn count(&self) -> usize {
28        self.interned.len()
29    }
30}
31
32impl<T: Eq + Clone> Default for Interner<T> {
33    fn default() -> Self {
34        Self::new()
35    }
36}