blob: a2d0ebb2abad208e208150f48f6fbeb05320dd3c [file] [log] [blame]
Jakub Kotura425e552020-12-21 17:28:15 +01001#![cfg(feature = "use_std")]
2
3use std::collections::HashMap;
4use std::hash::Hash;
5use std::iter::Iterator;
6
7/// Return a `HashMap` of keys mapped to a list of their corresponding values.
8///
Joel Galensonb593e252021-06-21 13:15:57 -07009/// See [`.into_group_map()`](crate::Itertools::into_group_map)
Jakub Kotura425e552020-12-21 17:28:15 +010010/// for more information.
11pub fn into_group_map<I, K, V>(iter: I) -> HashMap<K, Vec<V>>
12 where I: Iterator<Item=(K, V)>,
13 K: Hash + Eq,
14{
15 let mut lookup = HashMap::new();
16
Joel Galenson6f798712021-04-01 17:03:06 -070017 iter.for_each(|(key, val)| {
18 lookup.entry(key).or_insert_with(Vec::new).push(val);
19 });
Jakub Kotura425e552020-12-21 17:28:15 +010020
21 lookup
Joel Galenson6f798712021-04-01 17:03:06 -070022}
23
24pub fn into_group_map_by<I, K, V>(iter: I, f: impl Fn(&V) -> K) -> HashMap<K, Vec<V>>
25 where
26 I: Iterator<Item=V>,
27 K: Hash + Eq,
28{
29 into_group_map(
30 iter.map(|v| (f(&v), v))
31 )
32}