use std::fmt;
use std::fmt::{Display, Formatter};
use std::iter::FromIterator;
use token::Token;
pub trait Lexer<T: Token> {
fn peek(&self) -> Option<T>;
fn next_token(&mut self) -> T;
fn prev_token(&mut self) -> T;
}
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct LexerVec<T: Token> {
inner: Vec<T>,
index: usize,
}
impl<T: Token> Display for LexerVec<T> {
fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
write!(f, "(LexerVec)")
}
}
#[allow(dead_code)]
impl<T: Token> LexerVec<T>
{
pub fn new<Iter: IntoIterator<Item=I>, I: Into<T>>(tokens: Iter) -> LexerVec<T> {
let tokens = tokens.into_iter().map(|i|i.into()).collect();
LexerVec {
inner: tokens,
index: 0
}
}
fn peek(&self) -> Option<T> {
<Self as Lexer<T>>::peek(self)
}
fn next_token(&mut self) -> T {
<Self as Lexer<T>>::next_token(self)
}
fn prev_token(&mut self) -> T {
<Self as Lexer<T>>::prev_token(self)
}
}
impl<T: Token> Lexer<T> for LexerVec<T>
{
fn peek(&self) -> Option<T> {
if self.index < self.inner.len() {
Some(self.inner[self.index].clone())
} else {
None
}
}
fn next_token(&mut self) -> T {
let t = self.inner[self.index].clone();
if self.index + 1 < self.inner.len() {
self.index += 1;
}
t
}
fn prev_token(&mut self) -> T {
let t = self.inner[self.index].clone();
self.index -= 1;
t
}
}
impl<T: Token, I: Into<T>> FromIterator<I> for LexerVec<T> {
fn from_iter<Iter: IntoIterator<Item=I>>(iter: Iter) -> Self {
let v: Vec<T> = iter.into_iter().map(|i| i.into()).collect();
LexerVec::new(v)
}
}
impl<T: Token> Extend<T> for LexerVec<T> {
fn extend<I: IntoIterator<Item=T>>(&mut self, iter: I) {
self.inner.extend(iter);
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_lexervec_send() {
fn assert_send<T: Send>() {}
assert_send::<LexerVec<String>>();
}
#[test]
fn test_lexervec_sync() {
fn assert_sync<T: Sync>() {}
assert_sync::<LexerVec<String>>();
}
}