1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
//! イテレータのグルーピング。
/// イテレータのグルーピング。
///
/// # See also
/// [`GroupBy`]
///
/// [`GroupBy`]: trait.GroupBy.html
pub trait UsizeGroupBy<V> {
/// # Examples
/// ```
/// use nekolib::traits::UsizeGroupBy;
///
/// let a = vec![1, 4, 3, -5, -6, 0, 2, -2, 3];
/// let g = a.iter().copied().usize_group_by(|&ai: &i32| ai.rem_euclid(3) as usize);
///
/// assert_eq!(g.len(), 3);
/// assert_eq!(g[0], [3, -6, 0, 3]);
/// assert_eq!(g[1], [1, 4, -5, -2]);
/// assert_eq!(g[2], [2]);
/// ```
fn usize_group_by(self, index: impl FnMut(&V) -> usize) -> Vec<Vec<V>>;
}
impl<V, I: Iterator<Item = V>> UsizeGroupBy<V> for I {
fn usize_group_by(self, mut index: impl FnMut(&V) -> usize) -> Vec<Vec<V>> {
let mut res: Vec<Vec<_>> = vec![];
for v in self {
let i = index(&v);
if i >= res.len() {
res.resize_with(i + 1, Default::default);
}
res[i].push(v);
}
res
}
}