use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
use crate::eval::object::Object;
pub type Env = Rc<RefCell<Environment>>;
#[derive(Debug, Default, PartialEq, Eq)]
pub struct Environment {
store: HashMap<String, Rc<Object>>,
outer: Option<Env>,
}
impl Environment {
pub fn new() -> Environment {
Environment {
store: HashMap::new(),
outer: None,
}
}
pub fn new_enclosed_environment(outer: &Env) -> Environment {
Environment {
store: HashMap::new(),
outer: Some(Rc::clone(outer)),
}
}
pub fn get(&self, name: &str) -> Option<Rc<Object>> {
match self.store.get(name) {
Some(obj) => Some(Rc::clone(obj)),
None => {
if let Some(outer) = &self.outer {
outer.borrow().get(name)
} else {
None
}
}
}
}
pub fn set(&mut self, name: &str, val: Rc<Object>) {
self.store.insert(name.to_string(), val);
}
}