use std::collections::HashMap; use std::hash::Hash; /// Trait for grouping a collection of items by a key extracted from each item. pub trait GroupByKey { fn group_by_key(value: Vec, key_fn: impl Fn(&V) -> K) -> HashMap>; } impl GroupByKey for Vec { fn group_by_key(values: Vec, key_fn: impl Fn(&V) -> K) -> HashMap> { values .iter() .fold( HashMap::>::new(), |mut acc: HashMap<_, _>, chunk| { acc.entry(key_fn(chunk)).or_default().push(chunk); acc }, ) .into_iter() .map(|(key, mut chunks)| { chunks.sort(); (key.clone(), chunks.into_iter().cloned().collect::>()) }) .collect::>>() } }