use std::collections::HashMap; use std::hash::Hash; pub struct Environment<'a, T: 'a, U: 'a> { pub parent: Option<&'a Environment<'a, T, U>>, pub bindings: HashMap, } impl<'a, T: 'a, U: 'a> Environment<'a, T, U> where T: Eq + Hash { pub fn new(parent: Option<&'a Environment<'a, T, U>>) -> Environment<'a, T, U> { Environment { parent: parent, bindings: HashMap::new(), } } pub fn add_binding(&mut self, key: T, value: U) { self.bindings.insert(key, value); } pub fn lookup(&self, key: &T) -> Option<&U> { if let Some(v) = self.bindings.get(key) { Some(v) } else if let Some(p) = self.parent { p.lookup(key) } else { None } } }