yggdrasil_wasi/iterators/
mod.rs1use crate::syntax_node::NativeSyntaxData;
2use rctree::Node;
3use std::cell::RefCell;
4
5mod ancestors;
6mod children;
7
8pub enum NativeSyntaxIterator {
9 Ancestors(RefCell<MaybeReversed<NativeAncestors>>),
10 Previous(),
11 Following(),
12 Siblings(),
13 Children(RefCell<MaybeReversed<NativeChildren>>),
14 Descendants(),
15}
16pub struct NativeChildren {
17 pub parent: Node<NativeSyntaxData>,
18 pub current: Option<Node<NativeSyntaxData>>,
19}
20
21pub struct NativeAncestors {
22 pub remember: Vec<Node<NativeSyntaxData>>,
24 pub current: usize,
25}
26
27pub struct MaybeReversed<T> {
28 iterator: T,
29 reversed: bool,
30}
31
32impl<T> MaybeReversed<T>
33where
34 T: DoubleEndedIterator<Item = Node<NativeSyntaxData>>,
35{
36 pub fn forward(&mut self) -> Option<Node<NativeSyntaxData>> {
37 if self.reversed { self.iterator.next_back() } else { self.iterator.next() }
38 }
39 pub fn backward(&mut self) -> Option<Node<NativeSyntaxData>> {
40 if self.reversed { self.iterator.next() } else { self.iterator.next_back() }
41 }
42 pub fn reverse(&mut self) {
43 self.reversed = !self.reversed;
44 }
45}