use crate::lexer::LexResult; use crate::Tok; use std::iter::FusedIterator; #[derive(Clone, Debug)] pub(crate) struct TokenSource { tokens: std::vec::IntoIter, } impl TokenSource { pub(crate) fn new(tokens: Vec) -> Self { Self { tokens: tokens.into_iter(), } } } impl FromIterator for TokenSource { #[inline] fn from_iter>(iter: T) -> Self { Self::new(Vec::from_iter(iter)) } } impl Iterator for TokenSource { type Item = LexResult; #[inline] fn next(&mut self) -> Option { loop { let next = self.tokens.next()?; if is_trivia(&next) { continue; } break Some(next); } } } impl FusedIterator for TokenSource {} const fn is_trivia(result: &LexResult) -> bool { matches!(result, Ok((Tok::Comment(_) | Tok::NonLogicalNewline, _))) }