Skip to main content

tidepool_eval/
env.rs

1use crate::value::Value;
2use im::HashMap;
3use tidepool_repr::VarId;
4
5/// Evaluation environment: variable bindings.
6/// Uses im::HashMap for O(1) clone (structural sharing).
7pub type Env = HashMap<VarId, Value>;
8
9#[cfg(test)]
10mod tests {
11    use super::*;
12    use tidepool_repr::Literal;
13
14    #[test]
15    fn test_env_sharing() {
16        let env1 = Env::new();
17        let var1 = VarId(1);
18        let val1 = Value::Lit(Literal::LitInt(10));
19
20        let mut env2 = env1.clone();
21        env2.insert(var1, val1.clone());
22
23        assert!(env1.get(&var1).is_none());
24        assert_eq!(
25            match env2.get(&var1) {
26                Some(Value::Lit(Literal::LitInt(n))) => *n,
27                _ => 0,
28            },
29            10
30        );
31
32        let mut env3 = env2.clone();
33        let var2 = VarId(2);
34        let val2 = Value::Lit(Literal::LitInt(20));
35        env3.insert(var2, val2);
36
37        assert_eq!(env2.len(), 1);
38        assert_eq!(env3.len(), 2);
39    }
40}