nova-interpreter 0.1.1

An interpreter library for the nova language
Documentation
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()
    }
}