ralix 0.2.0

A simple, type-safe, tree walking interpreter
use crate::{Addr, Environment, Heap, Value, expressions::Identifier, object::module::Module};

pub struct RuntimeContext<'env> {
    pub(crate) environment: &'env mut Environment,
    pub(crate) heap: &'env mut Heap,
    pub(crate) self_module: Module,
    pub(crate) module_cache: &'env mut super::module_cache::ModuleCache,
}

impl RuntimeContext<'_> {
    pub fn define(&mut self, key: Identifier, value: Value) {
        let addr = self.heap.alloc(value);
        self.environment.define(key, addr);
    }

    pub fn get_addr(&mut self, name: &Identifier) -> Option<Addr> {
        self.environment.get_ptr(name)
    }

    pub fn get_cloned(&mut self, name: &Identifier) -> Option<Value> {
        let addr = self.environment.get_ptr(name)?;
        self.heap.read(&addr).cloned()
    }

    pub fn get(&mut self, name: &Identifier) -> Option<&Value> {
        let addr = self.environment.get_ptr(name)?;
        self.heap.read(&addr)
    }

    pub fn get_mut(&mut self, key: &Identifier) -> Option<&mut Value> {
        let addr = self.environment.get_ptr(key)?;
        self.heap.read_mut(&addr)
    }

    pub fn enter_scope(&mut self) {
        self.environment.enter_scope()
    }

    pub fn leave_scope(&mut self) {
        self.environment.leave_scope();
    }
}