use std::collections::HashMap;
use crate::value::{Value, FuncDef};
#[derive(Debug, Clone)]
pub struct Env {
bindings: HashMap<String, Value>,
functions: HashMap<String, FuncDef>,
}
impl Env {
pub fn new() -> Self {
Self {
bindings: HashMap::new(),
functions: HashMap::new(),
}
}
pub fn get(&self, name: &str) -> Option<&Value> {
self.bindings.get(name)
}
pub fn set(&mut self, name: String, val: Value) {
self.bindings.insert(name, val);
}
pub fn set_func(&mut self, func: FuncDef) {
self.functions.insert(func.name.clone(), func);
}
pub fn get_func(&self, name: &str) -> Option<&FuncDef> {
self.functions.get(name)
}
pub fn extend(&self) -> Env {
self.clone()
}
pub fn extend_with(&self, bindings: Vec<(String, Value)>) -> Env {
let mut new_env = self.clone();
for (k, v) in bindings {
new_env.bindings.insert(k, v);
}
new_env
}
pub fn snapshot(&self) -> Vec<(String, Value)> {
self.bindings.iter().map(|(k, v)| (k.clone(), v.clone())).collect()
}
}