pub_just/
table.rs

1use {super::*, std::collections::btree_map};
2
3#[derive(Debug, PartialEq, Serialize)]
4#[serde(transparent)]
5pub struct Table<'key, V: Keyed<'key>> {
6  map: BTreeMap<&'key str, V>,
7}
8
9impl<'key, V: Keyed<'key>> Table<'key, V> {
10  pub fn new() -> Self {
11    Self {
12      map: BTreeMap::new(),
13    }
14  }
15
16  pub fn insert(&mut self, value: V) {
17    self.map.insert(value.key(), value);
18  }
19
20  pub fn len(&self) -> usize {
21    self.map.len()
22  }
23
24  pub fn get(&self, key: &str) -> Option<&V> {
25    self.map.get(key)
26  }
27
28  pub fn is_empty(&self) -> bool {
29    self.map.is_empty()
30  }
31
32  pub fn values(&self) -> btree_map::Values<&'key str, V> {
33    self.map.values()
34  }
35
36  pub fn contains_key(&self, key: &str) -> bool {
37    self.map.contains_key(key)
38  }
39
40  pub fn keys(&self) -> btree_map::Keys<&'key str, V> {
41    self.map.keys()
42  }
43
44  pub fn iter(&self) -> btree_map::Iter<&'key str, V> {
45    self.map.iter()
46  }
47
48  pub fn pop(&mut self) -> Option<V> {
49    let key = self.map.keys().next().copied()?;
50    self.map.remove(key)
51  }
52
53  pub fn remove(&mut self, key: &str) -> Option<V> {
54    self.map.remove(key)
55  }
56}
57
58impl<'key, V: Keyed<'key>> Default for Table<'key, V> {
59  fn default() -> Self {
60    Self::new()
61  }
62}
63
64impl<'key, V: Keyed<'key>> FromIterator<V> for Table<'key, V> {
65  fn from_iter<I: IntoIterator<Item = V>>(iter: I) -> Self {
66    Self {
67      map: iter.into_iter().map(|value| (value.key(), value)).collect(),
68    }
69  }
70}
71
72impl<'key, V: Keyed<'key>> Index<&'key str> for Table<'key, V> {
73  type Output = V;
74
75  #[inline]
76  fn index(&self, key: &str) -> &V {
77    self.map.get(key).expect("no entry found for key")
78  }
79}
80
81impl<'key, V: Keyed<'key>> IntoIterator for Table<'key, V> {
82  type IntoIter = btree_map::IntoIter<&'key str, V>;
83  type Item = (&'key str, V);
84
85  fn into_iter(self) -> btree_map::IntoIter<&'key str, V> {
86    self.map.into_iter()
87  }
88}
89
90impl<'table, V: Keyed<'table> + 'table> IntoIterator for &'table Table<'table, V> {
91  type IntoIter = btree_map::Iter<'table, &'table str, V>;
92  type Item = (&'table &'table str, &'table V);
93
94  fn into_iter(self) -> btree_map::Iter<'table, &'table str, V> {
95    self.map.iter()
96  }
97}