usecrate::PutBack; #[cfg(feature = "use_alloc")] usecrate::PutBackN; usecrate::RepeatN; use std::iter::Peekable;
/// An iterator that allows peeking at an element before deciding to accept it. /// /// See [`.peeking_take_while()`](crate::Itertools::peeking_take_while) /// for more information. /// /// This is implemented by peeking adaptors like peekable and put back, /// but also by a few iterators that can be peeked natively, like the slice’s /// by reference iterator ([`std::slice::Iter`]). pubtrait PeekingNext: Iterator { /// Pass a reference to the next iterator element to the closure `accept`; /// if `accept` returns `true`, return it as the next element, /// else `None`. fn peeking_next<F>(&mutself, accept: F) -> Option<Self::Item> where Self: Sized,
F: FnOnce(&Self::Item) -> bool;
}
impl<I> PeekingNext for &mut I where
I: PeekingNext,
{ fn peeking_next<F>(&mutself, accept: F) -> Option<Self::Item> where
F: FnOnce(&Self::Item) -> bool,
{
(*self).peeking_next(accept)
}
}
impl<I> PeekingNext for Peekable<I> where
I: Iterator,
{ fn peeking_next<F>(&mutself, accept: F) -> Option<Self::Item> where
F: FnOnce(&Self::Item) -> bool,
{ iflet Some(r) = self.peek() { if !accept(r) { return None;
}
} self.next()
}
}
impl<I> PeekingNext for PutBack<I> where
I: Iterator,
{ fn peeking_next<F>(&mutself, accept: F) -> Option<Self::Item> where
F: FnOnce(&Self::Item) -> bool,
{ iflet Some(r) = self.next() { if !accept(&r) { self.put_back(r); return None;
}
Some(r)
} else {
None
}
}
}
impl<T: Clone> PeekingNext for RepeatN<T> { fn peeking_next<F>(&mutself, accept: F) -> Option<Self::Item> where
F: FnOnce(&Self::Item) -> bool,
{ let r = self.elt.as_ref()?; if !accept(r) { return None;
} self.next()
}
}
/// An iterator adaptor that takes items while a closure returns `true`. /// /// See [`.peeking_take_while()`](crate::Itertools::peeking_take_while) /// for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pubstruct PeekingTakeWhile<'a, I, F> where
I: Iterator + 'a,
{
iter: &'a mut I,
f: F,
}
impl<'a, I, F> std::fmt::Debug for PeekingTakeWhile<'a, I, F> where
I: Iterator + std::fmt::Debug + 'a,
{
debug_fmt_fields!(PeekingTakeWhile, iter);
}
/// Create a `PeekingTakeWhile` pubfn peeking_take_while<I, F>(iter: &mut I, f: F) -> PeekingTakeWhile<I, F> where
I: Iterator,
{
PeekingTakeWhile { iter, f }
}
impl<I, F> Iterator for PeekingTakeWhile<'_, I, F> where
I: PeekingNext,
F: FnMut(&I::Item) -> bool,
{ type Item = I::Item; fn next(&mutself) -> Option<Self::Item> { self.iter.peeking_next(&mutself.f)
}
impl<I, F> PeekingNext for PeekingTakeWhile<'_, I, F> where
I: PeekingNext,
F: FnMut(&I::Item) -> bool,
{ fn peeking_next<G>(&mutself, g: G) -> Option<Self::Item> where
G: FnOnce(&Self::Item) -> bool,
{ let f = &mutself.f; self.iter.peeking_next(|r| f(r) && g(r))
}
}
// Some iterators are so lightweight we can simply clone them to save their // state and use that for peeking.
macro_rules! peeking_next_by_clone {
([$($typarm:tt)*] $type_:ty) => { impl<$($typarm)*> PeekingNext for $type_ { fn peeking_next<F>(&mutself, accept: F) -> Option<Self::Item> where F: FnOnce(&Self::Item) -> bool
{ let saved_state = self.clone(); iflet Some(r) = self.next() { if !accept(&r) {
*self = saved_state;
} else { return Some(r)
}
}
None
}
}
}
}
// cloning a Rev has no extra overhead; peekable and put backs are never DEI.
peeking_next_by_clone! { [I: Clone + PeekingNext + DoubleEndedIterator]
::std::iter::Rev<I> }
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-09-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.