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}