1use std::fmt::Debug;
2
3use crate::prelude::*;
4
5pub struct TreeIter<'a, T> {
6 pub(crate) pos: usize,
7 pub(crate) tree: &'a Tree<T>,
8}
9
10impl<'a, T: Debug> Iterator for TreeIter<'a, T> {
11 type Item = Node<'a, T>;
12
13 fn next(&mut self) -> Option<Self::Item> {
14 let id = NodeId::from_index(self.pos);
15 self.pos += 1;
16 if self.pos <= self.tree.len() {
17 Some(self.tree._make_node(id))
18 } else {
19 None
20 }
21 }
22
23 fn size_hint(&self) -> (usize, Option<usize>) {
24 (0, Some(self.tree.len()))
25 }
26}
27
28pub struct IntoIter<'a, T> {
29 pub(crate) tree: &'a Tree<T>,
30}
31
32impl<'a, T: Debug> IntoIterator for IntoIter<'a, T> {
33 type Item = Node<'a, T>;
34 type IntoIter = TreeIter<'a, T>;
35
36 fn into_iter(self) -> Self::IntoIter {
37 TreeIter {
38 pos: 0,
39 tree: self.tree,
40 }
41 }
42}
43
44impl<'a, T: Debug> IntoIterator for &'a Tree<T> {
45 type Item = Node<'a, T>;
46 type IntoIter = TreeIter<'a, T>;
47
48 fn into_iter(self) -> Self::IntoIter {
49 TreeIter { pos: 0, tree: self }
50 }
51}
52
53#[derive(Debug)]
54pub struct ParentIter<'a, T> {
55 pub(crate) parent: usize,
56 pub(crate) node: NodeId,
57 pub(crate) tree: &'a Tree<T>,
58}
59
60impl<'a, T: Debug> Iterator for ParentIter<'a, T> {
61 type Item = Node<'a, T>;
62
63 fn next(&mut self) -> Option<Self::Item> {
64 if self.node.to_index() > 0 {
66 self.node = NodeId::from_index(self.parent);
67 self.parent = self.tree.parent[self.parent];
68 Some(self.tree._make_node(self.node))
69 } else {
70 None
71 }
72 }
73}
74
75#[derive(Debug)]
76pub struct ChildrenIter<'a, T> {
77 pub(crate) pos: usize,
78 pub(crate) parent: NodeId,
79 pub(crate) range: &'a [usize],
80 pub(crate) tree: &'a Tree<T>,
81}
82
83impl<'a, T> ChildrenIter<'a, T> {
84 pub fn new(parent: NodeId, tree: &'a Tree<T>) -> Self {
85 let range = &tree.parent[parent.to_index() + 1..];
86 ChildrenIter {
88 pos: 1,
89 parent,
90 range,
91 tree,
92 }
93 }
94}
95
96impl<'a, T: Debug> Iterator for ChildrenIter<'a, T> {
97 type Item = Node<'a, T>;
98
99 fn next(&mut self) -> Option<Self::Item> {
100 if self.pos <= self.range.len() {
102 let idx = self.parent.to_index();
103 let level_parent = self.tree.level[idx];
104 let node = NodeId::from_index(self.pos + idx);
105 let level_child = self.tree.level[node.to_index()];
106 self.pos += 1;
108
109 if level_child > level_parent {
110 Some(self.tree._make_node(node))
111 } else {
112 None
113 }
114 } else {
115 None
116 }
117 }
118}
119
120#[derive(Debug)]
121pub struct SiblingsIter<'a, T> {
122 pub(crate) pos: usize,
123 pub(crate) level: usize,
124 pub(crate) node: NodeId,
125 pub(crate) tree: &'a Tree<T>,
126}
127
128impl<'a, T: Debug> Iterator for SiblingsIter<'a, T> {
129 type Item = Node<'a, T>;
130
131 fn next(&mut self) -> Option<Self::Item> {
132 if self.pos <= self.tree.len() {
134 let start = self.pos;
135 if let Some(pos) =
136 self.tree.level[start..]
137 .iter()
138 .enumerate()
139 .find_map(|(pos, level)| {
140 let idx = self.pos + pos;
141 if *level == self.level && self.node.to_index() != idx {
142 Some(idx)
143 } else {
144 None
145 }
146 })
147 {
148 self.pos = pos + 1;
149 Some(self.tree._make_node(NodeId::from_index(pos)))
150 } else {
151 None
152 }
153 } else {
154 None
155 }
156 }
157}