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
use crate::{OpRef, OpRegionIter};

pub fn dfs_walk<F>(op: OpRef, apply: F)
where
    F: Fn(&OpRef) -> (),
{
    let regions = op.borrow().get_regions();
    let mut stack: Vec<(OpRegionIter, OpRef)> = vec![(regions, op)];

    while !stack.is_empty() {
        {
            let cur_op = stack.last_mut().unwrap();

            if let Some(region) = cur_op.0.next() {
                for b in region.iter() {
                    for op in b.iter() {
                        let regions = op.borrow().get_regions();
                        stack.push((regions, op));
                    }
                }
                continue;
            }
        }

        let cur_op = stack.pop().unwrap();
        apply(&cur_op.1);
    }
}