1use std::cell::Ref;
2use std::rc::Rc;
3
4use crate::{Node, NodeId, NodeRef, Tree};
5
6#[derive(Debug)]
8pub struct IntoIter<T>(slotmap::basic::IntoIter<NodeId, Node<T>>);
9
10impl<T> Iterator for IntoIter<T> {
11 type Item = T;
12
13 fn next(&mut self) -> Option<Self::Item> {
14 self.0.next().and_then(|(_node_id, node)| {
15 Rc::try_unwrap(node.value).map(|val| val.into_inner()).ok()
16 })
17 }
18
19 fn size_hint(&self) -> (usize, Option<usize>) {
20 self.0.size_hint()
21 }
22}
23
24impl<T> ExactSizeIterator for IntoIter<T> {}
25
26impl<T> IntoIterator for Tree<T> {
27 type Item = T;
28 type IntoIter = IntoIter<T>;
29
30 fn into_iter(self) -> Self::IntoIter {
31 IntoIter(self.sm.into_inner().into_iter())
32 }
33}
34
35pub struct Nodes<'a, T: 'a> {
37 r: Ref<'a, slotmap::SlotMap<NodeId, Node<T>>>,
38}
39
40impl<'a, 'b: 'a, T: 'a> IntoIterator for &'b Nodes<'a, T> {
41 type IntoIter = slotmap::basic::Iter<'a, NodeId, Node<T>>;
42 type Item = (NodeId, &'a Node<T>);
43
44 fn into_iter(self) -> slotmap::basic::Iter<'a, NodeId, Node<T>> {
45 self.r.iter()
46 }
47}
48
49impl<T> Tree<T> {
50 pub fn try_into_iter(self: Rc<Self>) -> Result<IntoIter<T>, Rc<Self>> {
51 Rc::try_unwrap(self).map(|tree| tree.into_iter())
52 }
53
54 pub fn nodes(&self) -> Nodes<T> {
55 Nodes {
56 r: self.sm.borrow(),
57 }
58 }
59}
60
61macro_rules! axis_iterators {
62 ($(#[$m:meta] $i:ident($f:path);)*) => {
63 $(
64 #[$m]
65 #[derive(Debug, Clone)]
66 pub struct $i<T>(Option<NodeRef<T>>);
67
68 impl<T> Iterator for $i<T> {
69 type Item = NodeRef<T>;
70
71 fn next(&mut self) -> Option<Self::Item> {
72 let node = self.0.take();
73 self.0 = node.as_ref().and_then($f);
74 node
75 }
76 }
77 )*
78 };
79}
80
81axis_iterators! {
82 Ancestors(NodeRef::parent);
84
85 PrevSiblings(NodeRef::prev_sibling);
87
88 NextSiblings(NodeRef::next_sibling);
90
91 FirstChildren(NodeRef::first_child);
93
94 LastChildren(NodeRef::last_child);
96}
97
98#[derive(Debug)]
100pub struct Children<T> {
101 front: Option<NodeRef<T>>,
102 back: Option<NodeRef<T>>,
103}
104
105impl<T> Clone for Children<T> {
106 fn clone(&self) -> Self {
107 Self {
108 front: self.front.clone(),
109 back: self.back.clone(),
110 }
111 }
112}
113
114impl<T> Iterator for Children<T> {
115 type Item = NodeRef<T>;
116
117 fn next(&mut self) -> Option<Self::Item> {
118 if self.front == self.back {
119 let node = self.front.take();
120 self.back = None;
121 node
122 } else {
123 let node = self.front.take();
124 self.front = node.as_ref().and_then(NodeRef::next_sibling);
125 node
126 }
127 }
128}
129
130impl<T> DoubleEndedIterator for Children<T> {
131 fn next_back(&mut self) -> Option<Self::Item> {
132 if self.back == self.front {
133 let node = self.back.take();
134 self.front = None;
135 node
136 } else {
137 let node = self.back.take();
138 self.back = node.as_ref().and_then(NodeRef::prev_sibling);
139 node
140 }
141 }
142}
143
144#[derive(Debug)]
146pub enum Edge<T> {
147 Open(NodeRef<T>),
149 Close(NodeRef<T>),
151}
152
153impl<T> Clone for Edge<T> {
154 fn clone(&self) -> Self {
155 match self {
156 Self::Close(node) => Self::Close(node.clone()),
157 Self::Open(node) => Self::Open(node.clone()),
158 }
159 }
160}
161
162impl<T> PartialEq for Edge<T> {
163 fn eq(&self, other: &Self) -> bool {
164 match (self, other) {
165 (Edge::Open(a), Edge::Open(b)) | (Edge::Close(a), Edge::Close(b)) => a == b,
166 _ => false,
167 }
168 }
169}
170
171#[derive(Debug)]
173pub struct Traverse<T> {
174 root: NodeRef<T>,
175 edge: Option<Edge<T>>,
176}
177
178impl<T> Clone for Traverse<T> {
179 fn clone(&self) -> Self {
180 Self {
181 root: self.root.clone(),
182 edge: self.edge.clone(),
183 }
184 }
185}
186
187impl<T> Iterator for Traverse<T> {
188 type Item = Edge<T>;
189
190 fn next(&mut self) -> Option<Self::Item> {
191 match &self.edge {
192 None => {
193 self.edge = Some(Edge::Open(self.root.clone()));
194 }
195 Some(Edge::Open(node)) => {
196 if let Some(first_child) = node.first_child() {
197 self.edge = Some(Edge::Open(first_child));
198 } else {
199 self.edge = Some(Edge::Close(node.clone()));
200 }
201 }
202 Some(Edge::Close(node)) => {
203 if node == &self.root {
204 self.edge = None;
205 } else if let Some(next_sibling) = node.next_sibling() {
206 self.edge = Some(Edge::Open(next_sibling));
207 } else {
208 self.edge = node.parent().map(Edge::Close);
209 }
210 }
211 }
212
213 self.edge.clone()
214 }
215}
216
217#[derive(Debug)]
219pub struct Descendants<T>(Traverse<T>);
220
221impl<T> Clone for Descendants<T> {
222 fn clone(&self) -> Self {
223 Descendants(self.0.clone())
224 }
225}
226
227impl<T> Iterator for Descendants<T> {
228 type Item = NodeRef<T>;
229
230 fn next(&mut self) -> Option<Self::Item> {
231 for edge in &mut self.0 {
232 if let Edge::Open(node) = edge {
233 return Some(node);
234 }
235 }
236 None
237 }
238}
239
240impl<T> NodeRef<T> {
241 pub fn ancestors(&self) -> Ancestors<T> {
243 Ancestors(self.parent())
244 }
245
246 pub fn prev_siblings(&self) -> PrevSiblings<T> {
248 PrevSiblings(self.prev_sibling())
249 }
250
251 pub fn next_siblings(&self) -> NextSiblings<T> {
253 NextSiblings(self.next_sibling())
254 }
255
256 pub fn first_children(&self) -> FirstChildren<T> {
258 FirstChildren(self.first_child())
259 }
260
261 pub fn last_children(&self) -> LastChildren<T> {
263 LastChildren(self.last_child())
264 }
265
266 pub fn children(&self) -> Children<T> {
268 Children {
269 front: self.first_child(),
270 back: self.last_child(),
271 }
272 }
273
274 pub fn traverse(&self) -> Traverse<T> {
276 Traverse {
277 root: self.clone(),
278 edge: None,
279 }
280 }
281
282 pub fn descendants(&self) -> Descendants<T> {
284 Descendants(self.traverse())
285 }
286}