1use crate::Node;
2
3pub struct Iter<'a> {
4 nodes: Vec<&'a Node>,
5}
6
7impl<'a> Iterator for Iter<'a> {
8 type Item = &'a Node;
9
10 fn next(&mut self) -> Option<Self::Item> {
11 self.nodes.pop()
12 }
13}
14
15fn recursive_iter<'a>(node: &'a Node, nodes: &mut Vec<&'a Node>) {
16 nodes.push(node);
17 for child in node.children.iter() {
18 recursive_iter(child, nodes);
19 }
20}
21
22impl Node {
23 #[inline]
24 pub fn iter(&self) -> Iter {
25 let mut nodes = Vec::new();
26 recursive_iter(self, &mut nodes);
27 nodes.reverse();
28 Iter { nodes }
29 }
30}
31
32#[cfg(test)]
33mod iter_test {
34 use super::*;
35
36 #[test]
37 fn test_node_iter() {
38 let mut root = Node::new_with_child(0, 1., 1., Node::new(1, 2., 2.));
39 assert_eq!(root.iter().count(), 2);
40 root.append_child(Node::new(2, 3., 3.));
41 assert_eq!(root.iter().count(), 3);
42 root.append_child(Node::new(3, 3., 3.));
43 assert_eq!(root.iter().count(), 4);
44 root.children[2].append_child(Node::new(4, 3., 3.));
45 assert_eq!(root.iter().count(), 5);
46
47 for (i, node) in root.iter().enumerate() {
48 assert_eq!(i, node.id);
49 }
50 }
51}