use proc_macro::{TokenTree,Ident};
use proc_macro::token_stream::IntoIter;
#[derive(Debug)]
pub enum FlatTree {
Ident(Ident),
Punct(()),
Literal(())
}
pub struct FlatIterator {
inner: Vec<IntoIter>
}
impl FlatIterator {
pub fn new(into_iter: IntoIter) -> FlatIterator {
FlatIterator{ inner: vec!(into_iter) }
}
}
impl Iterator for FlatIterator {
type Item = FlatTree;
fn next(&mut self) -> Option<<Self as Iterator>::Item> {
loop {
let next_iterator = self.inner.last_mut()?;
match next_iterator.next() {
None => {
self.inner.pop();
continue;
}
Some(tree) => {
match tree {
TokenTree::Group(g) => {
let new_iterator = g.stream().into_iter();
self.inner.push(new_iterator);
continue;
}
TokenTree::Ident(i) => {
return Some(FlatTree::Ident(i))
}
TokenTree::Punct(..) => {
return Some(FlatTree::Punct(()))
}
TokenTree::Literal(..) => {
return Some(FlatTree::Literal(()))
}
}
}
}
}
}
}