syntax_tree/iterator/
pre_order.rs1use crate::Node;
2use crate::iterator;
3use std::hash::Hash;
4
5pub 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}