1use crate::traits::has_branches::{HasBranches, HasBranchesAPI};
4pub use crate::unsafe_::*;
5
6pub struct TreeIterator<Visitor> {
8 stack: Vec<Visitor>,
9}
10
11impl<'a, Visitor> TreeIterator<Visitor>
12{
13 pub fn new<Value>(root: Value) -> Self
15 where Value: Into<Visitor>,
16 Visitor: UnsafeBorrow<'a> + UnsafeClone + 'a,
17 Visitor::Borrow: HasBranches<Visitor>,
18 {
19 let stack = Vec::new();
20 let mut iterator = Self { stack };
21 iterator.build(root.into());
22 iterator
23 }
24
25 fn build(&mut self, visitor: Visitor)
26 where Visitor: UnsafeBorrow<'a> + UnsafeClone + 'a,
27 Visitor::Borrow: HasBranches<Visitor>,
28 {
29 unsafe { self.stack.push(visitor.unsafe_clone()); }
30 for child in unsafe { longer_ref(&visitor).borrow() }.branches_impl2::<Visitor>() {
31 let visitor = child.into();
32 self.build(visitor);
33 }
34 }
35}
36
37impl<Visitor> Iterator for TreeIterator<Visitor> {
38 type Item = Visitor;
39
40 fn next(&mut self) -> Option<Self::Item> {
41 self.stack.pop()
42 }
43}