sway_utils/
mapped_stack.rs1use std::collections::HashMap;
2
3#[derive(Debug)]
7pub struct MappedStack<K: std::cmp::Eq + std::hash::Hash, V> {
8 container: HashMap<K, Vec<V>>,
9}
10
11impl<K: std::cmp::Eq + std::hash::Hash, V> MappedStack<K, V> {
12 pub fn new() -> MappedStack<K, V> {
13 MappedStack {
14 container: HashMap::<K, Vec<V>>::new(),
15 }
16 }
17 pub fn push(&mut self, k: K, v: V) {
18 match self.container.get_mut(&k) {
19 Some(val_vec) => {
20 val_vec.push(v);
21 }
22 None => {
23 self.container.insert(k, vec![v]);
24 }
25 }
26 }
27 pub fn get(&self, k: &K) -> Option<&V> {
28 self.container.get(k).and_then(|val_vec| val_vec.last())
29 }
30 pub fn get_mut(&mut self, k: &K) -> Option<&mut V> {
31 self.container
32 .get_mut(k)
33 .and_then(|val_vec| val_vec.last_mut())
34 }
35 pub fn pop(&mut self, k: &K) {
36 if let Some(val_vec) = self.container.get_mut(k) {
37 val_vec.pop();
38 if val_vec.is_empty() {
39 self.container.remove(k);
40 }
41 }
42 }
43}
44
45impl<K: std::cmp::Eq + std::hash::Hash, V> Default for MappedStack<K, V> {
46 fn default() -> Self {
47 Self::new()
48 }
49}