1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
// use crate::position::TreePath;
// pub trait HyperAstIterator<'a,'b:'a,'c:'b, IdN: 'b, N, NS: 'c, T: 'b>
// where
// IdN: Eq + Clone,
// N: crate::types::Tree<TreeId = IdN>,
// NS: crate::types::NodeStore<'a, IdN, N>,
// T: TreePath<IdN> + Clone,
// {
// fn is_dead_end(&'c self, b: &N) -> bool;
// fn is_matching(&self, b: &N) -> bool;
// fn node_store(&self) -> &NS;
// // fn path(&mut self) -> &mut T;
// fn all(&mut self) -> (&NS,&mut T,&mut Vec<(IdN, usize, Option<Vec<IdN>>)>);
// // fn stack(&mut self) -> &mut Vec<(IdN, usize, Option<Vec<IdN>>)>;
// // fn pop(&mut self) -> Option<(IdN, usize, Option<Vec<IdN>>)>;
// fn next(&'a mut self) -> Option<T> {
// let (ns,path,stack) = self.all();
// loop {
// // let (node, offset, children) = self.stack().pop()?;
// let (node, offset, children) = stack.pop()?;
// if let Some(children) = children {
// // if offset < children.len() {
// // let child = children[offset];
// // if offset == 0 {
// // self.path().goto(child, offset);
// // } else {
// // self.path().inc(child);
// // assert_eq!(*self.path().offset().unwrap(), offset + 1);
// // }
// // self.stack().push((node, offset + 1, Some(children)));
// // self.stack().push((child, 0, None));
// // continue;
// // } else {
// // self.path().pop().expect("should not go higher than root");
// // continue;
// // }
// return None;
// } else {
// let b = ns.resolve(&node);
// if self.is_dead_end(&b) {
// continue;
// }
// // if b.has_children() {
// // let children = b.get_children();
// // self.stack().push((node, 0, Some(children.to_vec())));
// // }
// // if self.is_matching(&b) {
// // return Some(self.path().clone());
// // }
// }
// }
// }
// }