pub fn transform_up<F>(&mut self, func: &mut F)
    where
        F: FnMut(&mut Expr) -> Option<Expr>,
    {
        for c in self.children_mut() {
            c.transform_up(func);
        }
        if let Some(e) = func(self) {
            *self = e;
        }
    }
Recursively transforms an expression in place by running a function first on its children, then on the root
expression itself; this can be more efficient than `transform` for some cases
weld/src/ast/ast.rs