use std::iter::Peekable; usecrate::PutBack; #[cfg(feature = "use_alloc")] usecrate::PutBackN;
/// 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 F: FnOnce(&Self::Item) -> bool;
}
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
}
}
}
/// 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: 'a, F> where I: Iterator,
{
iter: &'a mut I,
f: F,
}
impl<'a, I: 'a, F> std::fmt::Debug for PeekingTakeWhile<'a, I, F> where
I: Iterator + std::fmt::Debug,
{
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<'a, I, F> Iterator for PeekingTakeWhile<'a, I, F> where I: PeekingNext,
F: FnMut(&I::Item) -> bool,
// 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.16 Sekunden
(vorverarbeitet am 2026-06-19)
¤
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.