Skip to main content

ms_pdb/utils/
iter.rs

1//! Iterator utilities
2
3use std::collections::BTreeMap;
4
5/// Reads a slice of items and groups them using a function over the items.
6pub fn group_by<'a, T, F, K>(s: &'a [T], f: F) -> BTreeMap<K, Vec<&'a T>>
7where
8    F: Fn(&T) -> K,
9    K: Ord + Eq,
10{
11    let mut out: BTreeMap<K, Vec<&'a T>> = BTreeMap::new();
12
13    for item in s.iter() {
14        let key = f(item);
15        if let Some(list) = out.get_mut(&key) {
16            list.push(item);
17        } else {
18            out.insert(key, vec![item]);
19        }
20    }
21
22    out
23}
24
25/// Reads a sequence of items and groups them using a function over the items.
26pub fn group_by_iter_ref<'a, T, F, I, K>(iter: I, f: F) -> BTreeMap<K, Vec<&'a T>>
27where
28    I: Iterator<Item = &'a T>,
29    F: Fn(&T) -> K,
30    K: Ord + Eq,
31{
32    let mut out: BTreeMap<K, Vec<&'a T>> = BTreeMap::new();
33
34    for item in iter {
35        let key = f(item);
36        if let Some(list) = out.get_mut(&key) {
37            list.push(item);
38        } else {
39            out.insert(key, vec![item]);
40        }
41    }
42
43    out
44}
45
46/// Reads a sequence of items and groups them using a function over the items.
47pub fn group_by_iter<I, F, K>(iter: I, f: F) -> BTreeMap<K, Vec<I::Item>>
48where
49    I: Iterator,
50    F: Fn(&I::Item) -> K,
51    K: Ord + Eq,
52{
53    let mut out: BTreeMap<K, Vec<I::Item>> = BTreeMap::new();
54
55    for item in iter {
56        let key = f(&item);
57        if let Some(list) = out.get_mut(&key) {
58            list.push(item);
59        } else {
60            out.insert(key, vec![item]);
61        }
62    }
63
64    out
65}