use crate::{Walker, ControlFlow, walk::WalkOnce, protocol::lookup_visit, protocols::sequence};
pub struct IterWalker<I> {
iter: I,
}
impl<I> IterWalker<I>{
pub fn new<T: IntoIterator<IntoIter = I>>(iter: T) -> Self {
Self {
iter: iter.into_iter()
}
}
}
impl<'ctx, I> Walker<'ctx> for IterWalker<I>
where
I: Iterator,
<I as Iterator>::Item: WalkOnce<'ctx>
{
fn walk(&mut self, visitor: &mut dyn crate::Visitor<'ctx>) -> ControlFlow {
match lookup_visit::<sequence::Sequence, _>(visitor) {
Ok(visit) => {
visit.visit(self).to_done()
},
Err(err) => {
ControlFlow::Error
},
}
}
}
impl<'ctx, I> sequence::Accessor<'ctx> for IterWalker<I>
where
I: Iterator,
<I as Iterator>::Item: WalkOnce<'ctx>
{
fn next(&mut self, visitor: &mut dyn crate::Visitor<'ctx>) -> ControlFlow {
if let Some(value) = self.iter.next() {
match value.walk_once(visitor) {
Ok(_) => ControlFlow::Continue,
Err(err) => {
ControlFlow::Error
},
}
} else {
ControlFlow::Done
}
}
}