You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.0 KiB

/// Group iterator output every n values into `Vec<T>`.
pub struct GroupIter<T,I>
where I: Iterator<Item=T>
{
buffer: Vec<T>,
iter: I,
group_at: usize,
}
impl<T,I> Iterator for GroupIter<T,I>
where I: Iterator<Item=T>
{
type Item = Vec<T>;
fn next(&mut self) -> Option<Self::Item>
{
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<T,I> GroupIter<T,I>
where I: Iterator<Item=T>
{
fn swap(&mut self) -> Option<Vec<T>>
{
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<<Self as Iterator>::Item, Self>
{
GroupIter{
group_at: at,
iter: self,
buffer: Vec::with_capacity(at),
}
}
}
impl<T> GroupExt for T where T: Iterator{}