code: function walk2(node, fn1, fn2, level = 0) {
    level += 1;
    let len = node.children.length;
  
    for (let i = 0; i < len; ++i) {
      let child = node.children[i];
      let continueWalk = fn1(child, node, level);
  
      if (continueWalk === false) {
        fn2(child, node, level);
        break;
      }
  
      walk2(child, fn1, fn2, level);
      fn2(child, node, level);
    }
  }
docs: @method walk2
  @param {Node} node
  @param {function} fn1
  @param {Node} fn1.node
  @param {Node} fn1.parent
  @param {number} fn1.level
  
  fn1 is used when entering the node
  
  @param {function} fn2
  @param {Node} fn2.node
  @param {Node} fn2.parent
  @param {number} fn2.level
  
  fn2 is used when leaving the node