1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
        }
    }
}