use crate::{
VTPushParser,
event::{VTEvent, VTOwnedEvent},
};
pub struct VTIterator<I>
where
I: Iterator,
I::Item: AsRef<[u8]>,
{
parser: VTPushParser,
iter: I,
events: Vec<VTOwnedEvent>,
}
impl<I> VTIterator<I>
where
I: Iterator,
I::Item: AsRef<[u8]>,
{
pub fn new(iter: I) -> Self {
Self {
parser: VTPushParser::new(),
iter,
events: Vec::new(),
}
}
}
impl<I> Iterator for VTIterator<I>
where
I: Iterator,
I::Item: AsRef<[u8]>,
{
type Item = VTOwnedEvent;
fn next(&mut self) -> Option<Self::Item> {
while self.events.is_empty() {
if let Some(next) = self.iter.next() {
self.parser.feed_with(next.as_ref(), &mut |event: VTEvent| {
self.events.push(event.to_owned());
});
} else {
return None;
}
}
self.events.pop()
}
}