use std::iter::Peekable;
pub trait Peek: Iterator {
fn peek(&mut self) -> Option<&Self::Item>;
fn peek_mut(&mut self) -> Option<&mut Self::Item>;
fn next_if(&mut self, func: impl FnOnce(&Self::Item) -> bool) -> Option<Self::Item> {
match self.peek() {
Some(matched) if func(matched) => Some(self.next()?),
_ => None
}
}
fn next_if_eq<T>(&mut self, expected: &T) -> Option<Self::Item>
where
T: ?Sized,
Self::Item: PartialEq<T>,
{
self.next_if(|next| next == expected)
}
}
impl<I: Iterator> Peek for Peekable<I> {
fn peek(&mut self) -> Option<&Self::Item> {
self.peek()
}
fn peek_mut(&mut self) -> Option<&mut Self::Item> {
self.peek_mut()
}
fn next_if(&mut self, func: impl FnOnce(&Self::Item) -> bool) -> Option<Self::Item> {
self.next_if(func)
}
}