#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct Advance<I: Iterator> {
current: Option<I::Item>,
iter: I,
}
impl<I: Iterator> Advance<I> {
#[inline]
pub fn new(mut iter: I) -> Self {
Self {
current: iter.next(),
iter,
}
}
#[inline]
pub fn advance(&mut self) {
self.current = self.iter.next();
}
#[inline]
pub fn current(&self) -> Option<&I::Item> {
self.current.as_ref()
}
#[inline]
pub fn current_mut(&mut self) -> Option<&mut I::Item> {
self.current.as_mut()
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct CountingAdvance<I: Iterator> {
counter: usize,
current: Option<I::Item>,
iter: I,
}
impl<I: Iterator> CountingAdvance<I> {
#[inline]
pub fn new(mut iter: I) -> Self {
Self {
counter: 0,
current: iter.next(),
iter,
}
}
#[inline]
pub fn advance(&mut self) {
self.counter += 1;
self.current = self.iter.next();
}
#[inline]
pub fn counter(&self) -> usize {
self.counter
}
#[inline]
pub fn current(&self) -> Option<&I::Item> {
self.current.as_ref()
}
#[inline]
pub fn current_mut(&mut self) -> Option<&mut I::Item> {
self.current.as_mut()
}
}