crftng-intrprtrs/src/ast/ast_parser_iter.rs

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)
}
}