yggdrasil_wasi/iterators/
mod.rs

1use 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    // 0 is head
23    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}