diff --git a/src/env/mod.rs b/src/env/mod.rs index f39c3c5..0eb9bd9 100644 --- a/src/env/mod.rs +++ b/src/env/mod.rs @@ -1,44 +1,50 @@ use std::cell::RefCell; use std::collections::HashMap; +use std::rc::Rc; use crate::node::Node; mod core; -type RawEnvironment = HashMap; +#[derive(Debug, Clone)] +pub struct Environment(Rc); #[derive(Debug, Clone)] -pub struct Environment { - current: RefCell, - outer: Option>, +pub struct RawEnvironment { + current: RefCell>, + outer: Option, } impl Environment { pub fn new() -> Environment { let current = RefCell::new(core::core()); - Environment { + let env = RawEnvironment { current, outer: None, - } + }; + + Environment(Rc::new(env)) } pub fn get(&self, ident: &str) -> Option { - if let Some(val) = self.current.borrow().get(ident) { + if let Some(val) = self.0.current.borrow().get(ident) { return Some(val.clone()); } - self.outer.as_ref()?.get(ident) + self.0.outer.as_ref()?.get(ident) } pub fn wrap(&self, records: Vec<(String, Node)>) -> Environment { - Environment { + let env = RawEnvironment { current: RefCell::new(records.into_iter().collect()), - outer: Some(Box::new(self.clone())), - } + outer: Some(self.clone()), + }; + + Environment(Rc::new(env)) } fn set(&self, ident: String, val: Node) { - self.current.borrow_mut().insert(ident, val); + self.0.current.borrow_mut().insert(ident, val); } }