/// Group iterator output every n values into `Vec`. pub struct GroupIter where I: Iterator { buffer: Vec, iter: I, group_at: usize, } impl Iterator for GroupIter where I: Iterator { type Item = Vec; fn next(&mut self) -> Option { while self.buffer.len() < self.group_at { if let Some(value) = self.iter.next() { self.buffer.push(value) } else { return self.swap(); } } self.swap() } } impl GroupIter where I: Iterator { fn swap(&mut self) -> Option> { let buff = { let next = Vec::with_capacity(self.group_at); std::mem::replace(&mut self.buffer, next) }; if buff.len() > 0 { Some(buff) } else { None } } } pub trait GroupExt: Iterator + Sized { fn group_at(self, at: usize) -> GroupIter<::Item, Self> { GroupIter{ group_at: at, iter: self, buffer: Vec::with_capacity(at), } } } impl GroupExt for T where T: Iterator{}