38 lines
753 B
Rust
38 lines
753 B
Rust
use itertools::{peek_nth, PeekNth, PeekingNext};
|
|
|
|
pub struct ParserIter<T: Iterator>(PeekNth<T>);
|
|
|
|
impl<T: Iterator> ParserIter<T> {
|
|
pub fn new(iter: T) -> ParserIter<T> {
|
|
ParserIter(peek_nth(iter))
|
|
}
|
|
|
|
pub fn next(&mut self) -> T::Item {
|
|
self.0.next().unwrap()
|
|
}
|
|
|
|
pub fn peek_nth(&mut self, n: usize) -> &T::Item {
|
|
self.0.peek_nth(n).unwrap()
|
|
}
|
|
pub fn peek(&mut self) -> &T::Item {
|
|
self.peek_nth(0)
|
|
}
|
|
}
|
|
|
|
impl<T: Iterator> Iterator for ParserIter<T> {
|
|
type Item = T::Item;
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
Some(self.next())
|
|
}
|
|
}
|
|
|
|
impl<T: Iterator> PeekingNext for ParserIter<T> {
|
|
fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item>
|
|
where
|
|
F: FnOnce(&Self::Item) -> bool,
|
|
{
|
|
self.0.peeking_next(accept)
|
|
}
|
|
}
|