use crate::{TokenStream, TokenTree};
pub trait IntoTokens<T: TokenTree> {
fn into_tokens(self) -> impl Iterator<Item = T>;
}
pub trait ToTokens<T: TokenTree> {
fn to_tokens(&self) -> impl Iterator<Item = T> + '_;
}
impl<T: TokenTree, X: IntoTokens<T> + Clone> ToTokens<T> for X {
#[inline]
fn to_tokens(&self) -> impl Iterator<Item = T> {
self.clone().into_tokens()
}
}
impl<T: TokenTree, X: IntoTokens<T>> IntoTokens<T> for Option<X> {
#[inline]
fn into_tokens(self) -> impl Iterator<Item = T> {
self.into_iter().flat_map(|x| x.into_tokens())
}
}
pub trait ToTokenStream<T: TokenStream> {
fn extend_token_stream(&self, token_stream: &mut T);
#[inline]
fn into_token_stream(self) -> T
where
Self: Sized,
{
let mut ts = T::new();
self.extend_token_stream(&mut ts);
ts
}
#[inline]
fn to_token_stream(&self) -> T {
let mut ts = T::new();
self.extend_token_stream(&mut ts);
ts
}
}
impl<T: TokenStream, X: ToTokenStream<T>> ToTokenStream<T> for [X] {
#[inline]
fn extend_token_stream(&self, token_stream: &mut T) {
for i in self {
i.extend_token_stream(token_stream);
}
}
}
impl<T: TokenStream, X: ToTokenStream<T>> ToTokenStream<T> for Option<X> {
#[inline]
fn extend_token_stream(&self, token_stream: &mut T) {
if let Some(x) = self {
x.extend_token_stream(token_stream);
}
}
}
impl<T: TokenTree, T0: IntoTokens<T>, T1: IntoTokens<T>> IntoTokens<T> for (T0, T1) {
#[inline]
fn into_tokens(self) -> impl Iterator<Item = T>
where
Self: Sized,
{
self.0.into_tokens().chain(self.1.into_tokens())
}
}