ergotree_interpreter/eval/
env.rs1use std::collections::HashMap;
2use std::fmt::Display;
3
4use ergotree_ir::mir::val_def::ValId;
5use ergotree_ir::mir::value::Value;
6
7#[derive(PartialEq, Eq, Debug, Clone)]
9pub struct Env<'ctx> {
10 store: HashMap<ValId, Value<'ctx>>,
11}
12
13impl<'ctx> Env<'ctx> {
14 pub fn empty() -> Env<'ctx> {
16 Env {
17 store: HashMap::new(),
18 }
19 }
20
21 pub fn is_empty(&self) -> bool {
23 self.store.is_empty()
24 }
25
26 pub fn extend(&self, idx: ValId, v: Value<'ctx>) -> Env<'ctx> {
28 let mut new_store = self.store.clone();
29 new_store.insert(idx, v);
30 Env { store: new_store }
31 }
32
33 pub fn insert(&mut self, idx: ValId, v: Value<'ctx>) {
35 self.store.insert(idx, v);
36 }
37
38 pub fn remove(&mut self, idx: &ValId) {
40 self.store.remove(idx);
41 }
42
43 pub fn get(&self, idx: ValId) -> Option<&Value<'ctx>> {
45 self.store.get(&idx)
46 }
47 pub(crate) fn to_static(&'ctx self) -> Env<'static> {
49 Env {
50 store: self
51 .store
52 .iter()
53 .map(|(&k, v)| (k, v.to_static()))
54 .collect(),
55 }
56 }
57}
58
59impl Display for Env<'_> {
60 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
61 let mut keys: Vec<&ValId> = self.store.keys().collect();
62 keys.sort();
63 for k in keys {
64 writeln!(f, "v{}: {}", k, self.store[k])?;
65 }
66 Ok(())
67 }
68}