From 543c30c9366a823bd20938ead83dbf77b445a023 Mon Sep 17 00:00:00 2001 From: Philippe-Cholet Date: Thu, 18 Jan 2024 11:53:06 +0100 Subject: [PATCH] `RepeatN`: implement `PeekingNext` --- src/peeking_take_while.rs | 14 ++++++++++++++ src/repeatn.rs | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/peeking_take_while.rs b/src/peeking_take_while.rs index b4852c1c9..b224907aa 100644 --- a/src/peeking_take_while.rs +++ b/src/peeking_take_while.rs @@ -1,6 +1,7 @@ use crate::PutBack; #[cfg(feature = "use_alloc")] use crate::PutBackN; +use crate::RepeatN; use std::iter::Peekable; /// An iterator that allows peeking at an element before deciding to accept it. @@ -91,6 +92,19 @@ where } } +impl PeekingNext for RepeatN { + fn peeking_next(&mut self, accept: F) -> Option + 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) diff --git a/src/repeatn.rs b/src/repeatn.rs index 539c42615..d86ad9fac 100644 --- a/src/repeatn.rs +++ b/src/repeatn.rs @@ -6,7 +6,7 @@ use std::iter::FusedIterator; #[must_use = "iterators are lazy and do nothing unless consumed"] #[derive(Clone, Debug)] pub struct RepeatN { - elt: Option, + pub(crate) elt: Option, n: usize, }