sws_tree/
iter.rs

1use std::cell::Ref;
2use std::rc::Rc;
3
4use crate::{Node, NodeId, NodeRef, Tree};
5
6/// Iterator that moves out of a tree in insert order.
7#[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
35/// Iterator over nodes in insert order.
36pub 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    /// Iterator over ancestors.
83    Ancestors(NodeRef::parent);
84
85    /// Iterator over previous siblings.
86    PrevSiblings(NodeRef::prev_sibling);
87
88    /// Iterator over next siblings.
89    NextSiblings(NodeRef::next_sibling);
90
91    /// Iterator over first children.
92    FirstChildren(NodeRef::first_child);
93
94    /// Iterator over last children.
95    LastChildren(NodeRef::last_child);
96}
97
98/// Iterator over children.
99#[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/// Open or close edge of a node.
145#[derive(Debug)]
146pub enum Edge<T> {
147    /// Open.
148    Open(NodeRef<T>),
149    /// Close.
150    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/// Iterator which traverses a subtree.
172#[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/// Iterator over a node and its descendants.
218#[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    /// Returns an iterator over ancestors.
242    pub fn ancestors(&self) -> Ancestors<T> {
243        Ancestors(self.parent())
244    }
245
246    /// Returns an iterator over previous siblings.
247    pub fn prev_siblings(&self) -> PrevSiblings<T> {
248        PrevSiblings(self.prev_sibling())
249    }
250
251    /// Returns an iterator over next siblings.
252    pub fn next_siblings(&self) -> NextSiblings<T> {
253        NextSiblings(self.next_sibling())
254    }
255
256    /// Returns an iterator over first children.
257    pub fn first_children(&self) -> FirstChildren<T> {
258        FirstChildren(self.first_child())
259    }
260
261    /// Returns an iterator over last children.
262    pub fn last_children(&self) -> LastChildren<T> {
263        LastChildren(self.last_child())
264    }
265
266    /// Returns an iterator over children.
267    pub fn children(&self) -> Children<T> {
268        Children {
269            front: self.first_child(),
270            back: self.last_child(),
271        }
272    }
273
274    /// Returns an iterator which traverses the subtree starting at this node.
275    pub fn traverse(&self) -> Traverse<T> {
276        Traverse {
277            root: self.clone(),
278            edge: None,
279        }
280    }
281
282    /// Returns an iterator over this node and its descendants.
283    pub fn descendants(&self) -> Descendants<T> {
284        Descendants(self.traverse())
285    }
286}