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
use crate::runtime::rtree::rnode::{RNode, RNodeId};
use crate::runtime::rtree::RuntimeTree;
use std::collections::VecDeque;

pub struct RtTreeBfsIter<'a> {
    pub queue: VecDeque<RNodeId>,
    pub tree: &'a RuntimeTree,
}

impl<'a> Iterator for RtTreeBfsIter<'a> {
    type Item = (RNodeId, &'a RNode);

    fn next(&mut self) -> Option<Self::Item> {
        match self.queue.pop_front() {
            None => None,
            Some(id) => match self.tree.nodes.get(&id) {
                None => None,
                Some(node) => {
                    match &node {
                        RNode::Leaf(_, _) => {}
                        RNode::Flow(_, _, _, children) => self.queue.extend(children.iter()),
                        RNode::Decorator(_, _, child) => self.queue.push_back(*child),
                    }
                    Some((id, node))
                }
            },
        }
    }
}