competitive_hpp/utils/
btree.rs

1use std::collections::{BTreeMap, BTreeSet};
2
3pub trait BTreeMapUtils<T, U> {
4    fn min_elem(&self) -> Option<(&T, &U)>;
5    fn max_elem(&self) -> Option<(&T, &U)>;
6}
7
8impl<T, U> BTreeMapUtils<T, U> for BTreeMap<T, U> {
9    fn min_elem(&self) -> Option<(&T, &U)> {
10        self.iter().next()
11    }
12    fn max_elem(&self) -> Option<(&T, &U)> {
13        self.iter().next_back()
14    }
15}
16
17pub trait BTreeSetUtils<T> {
18    fn min_elem(&self) -> Option<&T>;
19    fn max_elem(&self) -> Option<&T>;
20}
21
22impl<T> BTreeSetUtils<T> for BTreeSet<T> {
23    fn min_elem(&self) -> Option<&T> {
24        self.iter().next()
25    }
26    fn max_elem(&self) -> Option<&T> {
27        self.iter().next_back()
28    }
29}
30
31#[cfg(test)]
32mod test {
33    use super::*;
34
35    #[test]
36    fn btree_map_test() {
37        let tree: BTreeMap<i32, i32> = maplit::btreemap! { 1 => 1, 3 => 3, 2 => 2 };
38
39        assert_eq!(tree.min_elem(), Some((&1, &1)));
40        assert_eq!(tree.max_elem(), Some((&3, &3)));
41    }
42
43    #[test]
44    fn btree_set_test() {
45        let set: BTreeSet<i32> = maplit::btreeset! { 1, 3, 2 };
46
47        assert_eq!(set.min_elem(), Some(&1));
48        assert_eq!(set.max_elem(), Some(&3));
49    }
50}