use crate::{Consumable, ConsumeError};
#[derive(Debug)]
pub struct OneOrMore<T> {
head: T,
tail: Vec<T>,
}
impl<T> OneOrMore<T> {
pub fn head(&self) -> &T {
&self.head
}
pub fn tail(&self) -> &Vec<T> {
&self.tail
}
pub fn into_vec(self) -> Vec<T> {
let mut vec = Vec::with_capacity(self.tail().len() + 1);
vec.push(self.head);
self.tail.into_iter().for_each(|item| vec.push(item));
vec
}
pub fn ref_vec(&self) -> Vec<&T> {
let mut vec = Vec::with_capacity(self.tail().len() + 1);
vec.push(&self.head);
self.tail.iter().for_each(|item| vec.push(&item));
vec
}
pub fn mut_vec(&mut self) -> Vec<&mut T> {
let mut vec = Vec::with_capacity(self.tail().len() + 1);
vec.push(&mut self.head);
self.tail.iter_mut().for_each(|item| vec.push(item));
vec
}
}
impl<T: Consumable> IntoIterator for OneOrMore<T> {
type Item = T;
type IntoIter = std::vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.into_vec().into_iter()
}
}
impl<T: Consumable> Consumable for OneOrMore<T> {
fn consume_from(s: &str) -> Result<(Self, &str), ConsumeError> {
let (head, unconsumed) = T::consume_from(s)?;
let (tail, unconsumed) = <Vec<T>>::consume_from(unconsumed)?;
Ok((OneOrMore { head, tail }, unconsumed))
}
}