yapcol 0.4.0

Yet Another Parser Combinator Library - YAPCoL
Documentation
use crate::input::core::InputToken;
use crate::input::source::InputSource;
use std::iter::Peekable;

pub(crate) struct TokenInputSource<I>
where
	I: Iterator<Item: InputToken>,
{
	source_name: Option<String>,
	stream: Peekable<I>,
}

impl<I> InputSource for TokenInputSource<I>
where
	I: Iterator<Item: InputToken>,
{
	type Token = I::Item;

	fn source_name(&self) -> Option<&String> {
		self.source_name.as_ref()
	}

	fn next_token(&mut self) -> Option<Self::Token> {
		self.stream.next()
	}

	fn peek(&mut self) -> Option<&Self::Token> {
		self.stream.peek()
	}
}

impl<I> TokenInputSource<I>
where
	I: Iterator<Item: InputToken>,
{
	pub fn new<S>(source: S, source_name: Option<String>) -> Self
	where
		S: IntoIterator<Item: InputToken, IntoIter = I>,
	{
		Self {
			source_name,
			stream: source.into_iter().peekable(),
		}
	}
}