1use std::collections::BTreeMap;
4
5pub 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
25pub 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
46pub 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}