syntax_tree/iterator/
pre_order.rs

1use crate::Node;
2use crate::iterator;
3use std::hash::Hash;
4
5/// Depth-first iterator in pre-order.
6pub struct PreOrder<'a, T> {
7    stack: Vec<iterator::Item<'a, T>>,
8}
9
10impl<'a, T> PreOrder<'a, T>
11    where T: Eq + Hash {
12    pub fn new(root: &'a Node<T>) -> Self {
13        PreOrder {
14            stack: vec!(iterator::Item {
15                node: root,
16                level: 0,
17            }),
18        }
19    }
20}
21
22impl<'a, T> Iterator for PreOrder<'a, T>
23    where T: Eq + Hash {
24    type Item = iterator::Item<'a, T>;
25
26    fn next(&mut self) -> Option<Self::Item> {
27        if self.stack.is_empty() {
28            None
29        } else {
30            let item = self.stack.pop().unwrap();
31
32            if !item.node.is_leaf() {
33                let length = item.node.child_count();
34                for i in 0..length {
35                    self.stack.push(iterator::Item {
36                        node: &item.node.children()[length - i - 1],
37                        level: item.level + 1,
38                    });
39                }
40            }
41
42            Some(item)
43        }
44    }
45}