pub struct Pair<I>
where I: Iterator
{
iter: I,
last_elem: Option<I::Item>
}
impl<I: Iterator> Iterator for Pair<I> {
type Item = (I::Item, I::Item);
#[inline]
fn next(&mut self) -> Option<(I::Item, I::Item)> {
let elem1 = self.iter.next();
if elem1.is_none() {
None
} else {
let elem2 = self.iter.next();
if elem2.is_none() {
self.last_elem = elem1;
None
} else {
Some((elem1.unwrap(), elem2.unwrap()))
}
}
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
match self.iter.size_hint() {
(n, None) => (n/2, None),
(n, Some(m)) => (n/2, Some(m/2))
}
}
}
impl<I: Iterator> Pair<I> {
#[inline]
pub fn remainder(self) -> Option<I::Item> {
self.last_elem
}
}
pub trait Pairable : Sized + Iterator {
fn pair(self) -> Pair<Self>;
}
impl<I: Iterator> Pairable for I {
#[inline]
fn pair(self) -> Pair<I> {
Pair {iter: self, last_elem: None }
}
}