ergotree_interpreter/eval/
env.rs

1use std::collections::HashMap;
2use std::fmt::Display;
3
4use ergotree_ir::mir::val_def::ValId;
5use ergotree_ir::mir::value::Value;
6
7/// Environment for the interpreter
8#[derive(PartialEq, Eq, Debug, Clone)]
9pub struct Env<'ctx> {
10    store: HashMap<ValId, Value<'ctx>>,
11}
12
13impl<'ctx> Env<'ctx> {
14    /// Empty environment
15    pub fn empty() -> Env<'ctx> {
16        Env {
17            store: HashMap::new(),
18        }
19    }
20
21    /// Returns `true` if the environment is empty
22    pub fn is_empty(&self) -> bool {
23        self.store.is_empty()
24    }
25
26    /// Extend this environment (create new) with added element
27    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    /// Insert a Value for the given ValId
34    pub fn insert(&mut self, idx: ValId, v: Value<'ctx>) {
35        self.store.insert(idx, v);
36    }
37
38    /// Remove a Value for the given ValId
39    pub fn remove(&mut self, idx: &ValId) {
40        self.store.remove(idx);
41    }
42
43    /// Get an element
44    pub fn get(&self, idx: ValId) -> Option<&Value<'ctx>> {
45        self.store.get(&idx)
46    }
47    /// Convert borrowed data to Arc
48    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}