pulsar_utils/
environment.rs1use std::{collections::HashMap, hash::Hash};
3
4pub type Scope<Name, T> = HashMap<Name, T>;
6
7pub struct Environment<Name: Eq + Hash, T> {
9 scopes: Vec<Scope<Name, T>>
10}
11
12impl<Name: Eq + Hash, T> Environment<Name, T> {
13 pub fn new() -> Self {
16 Environment {
17 scopes: vec![Scope::new()]
18 }
19 }
20
21 pub fn push(&mut self) {
23 self.scopes.push(Scope::new());
24 }
25
26 pub fn pop(&mut self) -> bool {
29 if self.scopes.len() == 1 {
30 false
31 } else {
32 self.scopes.pop();
33 true
34 }
35 }
36
37 pub fn bind(&mut self, name: Name, value: T) -> Option<T> {
41 self.scopes.last_mut().unwrap().insert(name, value)
42 }
43
44 pub fn bind_base(&mut self, name: Name, value: T) -> Option<T> {
48 self.scopes.first_mut().unwrap().insert(name, value)
49 }
50
51 pub fn find(&self, name: Name) -> Option<&T> {
53 for scope in self.scopes.iter().rev() {
54 if let Some(value) = scope.get(&name) {
55 return Some(value);
56 }
57 }
58 None
59 }
60}
61
62impl<Name: Eq + Hash, T> Default for Environment<Name, T> {
63 fn default() -> Self {
64 Self::new()
65 }
66}