nova-interpreter 0.1.1

An interpreter library for the nova language
Documentation
use crate::utils::interner::Interner;

pub struct State {
    pub registers: Box<[usize]>,
    pub interner: Interner<String>,
}

impl State {
    #[inline(always)]
    pub fn set(&mut self, register: usize, value: usize) {
        self.registers[register] = value;
    }

    #[inline(always)]
    pub fn value(&self, register: usize) -> usize {
        self.registers[register]
    }

    #[inline(always)]
    pub fn present(&self, register: usize) -> bool {
        self.registers[register] != 0
    }

    #[inline(always)]
    pub fn produce(&mut self, register: usize, num: usize) {
        self.registers[register] = self.registers[register].saturating_add(num);
    }

    #[inline(always)]
    pub fn consume(&mut self, register: usize, num: usize) {
        self.registers[register] = self.registers[register].saturating_sub(num);
    }

    #[inline(always)]
    pub fn clear(&mut self, register: usize) {
        self.registers[register] = 0;
    }

    pub fn print_state(&mut self) {
        for (register, value) in self.registers.iter().enumerate() {
            let register = &mut self.interner.lookup(register).unwrap();
            if *value != 0 {
                println!("\t{register} :: {}", value);
            }
        }
    }
}