Skip to content

Commit 794bdad

Browse files
committed
Added into_group_map_by, into_group_map_by_fold
1 parent 43a6b6e commit 794bdad

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

src/group_map.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,42 @@ pub fn into_group_map<I, K, V>(iter: I) -> HashMap<K, Vec<V>>
1919
}
2020

2121
lookup
22-
}
22+
}
23+
24+
pub fn into_group_map_by<I, K, V>(iter: I, f: impl Fn(&V) -> K) -> HashMap<K, Vec<V>>
25+
where I: Iterator<Item=V>,
26+
K: Hash + Eq,
27+
{
28+
let mut lookup = HashMap::new();
29+
30+
for val in iter {
31+
let key = f(&val);
32+
lookup.entry(key).or_insert(Vec::new()).push(val);
33+
}
34+
35+
lookup
36+
}
37+
38+
pub fn into_group_map_by_fold<I, K, V, Acc, Fold>(iter: I, f_key: impl Fn(&V) -> K,
39+
init: Acc,
40+
fold: Fold) -> HashMap<K, Acc>
41+
where I: Iterator<Item=V>,
42+
K: Hash + Eq,
43+
Acc: Clone,
44+
Fold : FnMut(Acc,V) -> Acc + Clone
45+
46+
47+
{
48+
let mut lookup = HashMap::new();
49+
50+
for val in iter {
51+
let key = f_key(&val);
52+
lookup.entry(key).or_insert(Vec::new()).push(val);
53+
}
54+
55+
lookup
56+
.into_iter()
57+
.map(move |(key,value)| (key, value.into_iter().fold(init.clone(), fold.clone())))
58+
.collect()
59+
}
60+

0 commit comments

Comments
 (0)