pub(crate) mod intern;
pub(crate) mod str;
use std::iter::Peekable;
pub(crate) struct PauseAt<'a, I: Iterator, F: FnMut(&I::Item) -> bool> {
peek: &'a mut Peekable<I>,
pred: F,
paused: Option<bool>,
}
impl<'a, I: Iterator, F: FnMut(&I::Item) -> bool> PauseAt<'a, I, F> {
pub(crate) fn from_peekable(peek: &'a mut Peekable<I>, pred: F) -> Self
where
F: FnMut(&I::Item) -> bool,
{
PauseAt {
peek,
pred,
paused: None,
}
}
#[cfg(any(test, feature = "routerdesc"))]
pub(crate) fn new_pred<F2>(self, pred: F2) -> PauseAt<'a, I, F2>
where
F2: FnMut(&I::Item) -> bool,
{
PauseAt::from_peekable(self.peek, pred)
}
#[allow(unused)]
pub(crate) fn remaining(self) -> &'a mut Peekable<I> {
self.peek
}
#[allow(unused)]
pub(crate) fn peek(&mut self) -> Option<&I::Item> {
if self.check_paused() {
None
} else {
self.peek.peek()
}
}
fn check_paused(&mut self) -> bool {
if let Some(p) = self.paused {
return p;
}
if let Some(nextval) = self.peek.peek() {
let p = (self.pred)(nextval);
self.paused = Some(p);
p
} else {
self.paused = Some(false);
false
}
}
}
impl<'a, I: Iterator, F: FnMut(&I::Item) -> bool> Iterator for PauseAt<'a, I, F> {
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
if self.check_paused() {
None
} else {
self.paused = None;
self.peek.next()
}
}
}
pub(crate) mod private {
pub trait Sealed {}
}
#[cfg(test)]
mod tests {
#[test]
fn test_pause_at() {
use super::PauseAt;
let mut iter = (1..10).into_iter().peekable();
let mut iter = PauseAt::from_peekable(&mut iter, |x| *x == 3);
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), None);
let mut iter = iter.new_pred(|x| *x > 5);
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.next(), Some(4));
assert_eq!(iter.next(), Some(5));
assert_eq!(iter.peek(), None);
assert_eq!(iter.next(), None);
let iter = iter.remaining();
assert_eq!(iter.next(), Some(6));
assert_eq!(iter.peek(), Some(&7));
assert_eq!(iter.next(), Some(7));
assert_eq!(iter.next(), Some(8));
assert_eq!(iter.next(), Some(9));
assert_eq!(iter.peek(), None);
assert_eq!(iter.next(), None);
}
#[test]
fn test_parse_at_mutable() {
use super::PauseAt;
let mut count = 0;
let mut iter = (1..10).into_iter().peekable();
let mut iter = PauseAt::from_peekable(&mut iter, |_| {
count += 1;
count == 4
});
assert_eq!(iter.peek(), Some(&1)); assert_eq!(iter.peek(), Some(&1)); assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.peek(), Some(&3));
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.peek(), None);
assert_eq!(iter.next(), None);
}
}