nova_interpreter/utils/
interner.rs1pub 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}