Skip to content

Commit

Permalink
Merge pull request #23 from ratmice/skip
Browse files Browse the repository at this point in the history
add skip
  • Loading branch information
Crazytieguy authored Dec 9, 2023
2 parents 672ba89 + 66c162a commit cbe08a2
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/adapters/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ mod enumerate;
mod filter;
mod filter_map;
mod map;
mod skip;
mod step_by;
mod take;
mod take_while;
Expand All @@ -14,6 +15,7 @@ pub use self::enumerate::Enumerate;
pub use self::filter::Filter;
pub use self::filter_map::FilterMap;
pub use self::map::{IntoIter, Map};
pub use self::skip::Skip;
pub use self::step_by::StepBy;
pub use self::take::Take;
pub use self::take_while::TakeWhile;
Expand Down
47 changes: 47 additions & 0 deletions src/adapters/skip.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
use crate::LendingIterator;

/// A lending iterator that skips over the first `n` items of `iter`.
#[derive(Clone)]
pub struct Skip<I> {
n: usize,
iter: I,
}

impl<I> Skip<I> {
pub(crate) fn new(iter: I, n: usize) -> Skip<I> {
Skip { iter, n }
}
}

impl<I> LendingIterator for Skip<I>
where
I: LendingIterator,
{
type Item<'a> = I::Item<'a> where I: 'a;

fn next(&mut self) -> Option<I::Item<'_>> {
if self.n > 0 {
self.iter.nth(core::mem::take(&mut self.n))
} else {
self.iter.next()
}
}

fn size_hint(&self) -> (usize, Option<usize>) {
let (lower, upper) = self.iter.size_hint();

let lower = lower.saturating_sub(self.n);
let upper = upper.map(|x| x.saturating_sub(self.n));
(lower, upper)
}
}

#[cfg(test)]
mod test {
use super::*;
use crate::ToLendingIterator;
#[test]
fn test() {
assert_eq!((0..5).into_lending().skip(1).nth(1), (0..5).skip(1).nth(1))
}
}
10 changes: 9 additions & 1 deletion src/traits/lending_iterator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::{num::NonZeroUsize, ops::Deref};

use crate::{
Chain, Cloned, Enumerate, Filter, FilterMap, Map, OptionTrait, SingleArgFnMut, SingleArgFnOnce,
StepBy, Take, Zip, TakeWhile,
Skip, StepBy, Take, Zip, TakeWhile,
};

/// Like [`Iterator`], but items may borrow from `&mut self`.
Expand Down Expand Up @@ -213,4 +213,12 @@ pub trait LendingIterator {
{
Enumerate::new(self)
}

/// Creates a lending iterator that skips over the first `n` elements of self.
fn skip(self, n: usize) -> Skip<Self>
where
Self: Sized,
{
Skip::new(self, n)
}
}

0 comments on commit cbe08a2

Please sign in to comment.