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 38 39 40 41 42 43 44 45 46 47 48
use crate::LendingIterator;
/// A lending iterator for stepping lending iterators by a custom amount.
///
/// This `struct` is created by the [`step_by`] method on [`LendingIterator`]. See
/// its documentation for more.
///
/// [`LendingIterator`]: crate::LendingIterator
/// [`step_by`]: crate::LendingIterator::step_by
#[derive(Clone, Debug)]
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct StepBy<I> {
iter: I,
step: usize,
first_take: bool,
}
impl<I> StepBy<I> {
#[inline]
pub(crate) fn new(iter: I, step: usize) -> StepBy<I> {
assert!(step != 0);
StepBy {
iter,
step: step - 1,
first_take: true,
}
}
}
impl<I> LendingIterator for StepBy<I>
where
I: LendingIterator,
{
type Item<'a> = I::Item<'a>
where
Self: 'a
;
#[inline]
fn next(&mut self) -> Option<Self::Item<'_>> {
if self.first_take {
self.first_take = false;
self.iter.next()
} else {
self.iter.nth(self.step)
}
}
}