sway_utils/
mapped_stack.rs

1use std::collections::HashMap;
2
3/// A HashMap that can hold multiple values and
4/// fetch values in a LIFO manner. Rust's MultiMap
5/// handles values in a FIFO manner.
6#[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}