File Explorer

/var/lang/lib/node_modules/npm/node_modules/treeverse/lib

This explorer reads the filesystem of the server it runs on, so /workspace/user isn't present here. Browsing and the terminal still work against this server's own disk from /.

depth-descent.js1.8 KB · 89 lines
// Perform a depth-first walk of a tree, ONLY doing the descent (visit)//// This uses a stack rather than recursion, so that it can handle deeply// nested trees without call stack overflows.  (My kingdom for proper TCO!)//// This is only used for cases where leave() is not specified.//// a// +-- b// |   +-- 1// |   +-- 2// +-- c//     +-- 3//     +-- 4//// Expect:// visit a// visit b// visit 1// visit 2// visit c// visit 3// visit 4//// stack.push(tree)// while stack not empty//   pop T from stack//   VISIT(T)//   get children C of T//   push each C onto stack const depth = ({  visit,  filter,  getChildren,  tree,}) => {  const stack = []  const seen = new Map()   const next = () => {    while (stack.length) {      const node = stack.pop()      const res = visitNode(node)      if (isPromise(res)) {        return res.then(() => next())      }    }    return seen.get(tree)  }   const visitNode = (visitTree) => {    if (seen.has(visitTree)) {      return seen.get(visitTree)    }     seen.set(visitTree, null)    const res = visit ? visit(visitTree) : visitTree    if (isPromise(res)) {      const fullResult = res.then(resThen => {        seen.set(visitTree, resThen)        return kidNodes(visitTree)      })      seen.set(visitTree, fullResult)      return fullResult    } else {      seen.set(visitTree, res)      return kidNodes(visitTree)    }  }   const kidNodes = (kidTree) => {    const kids = getChildren(kidTree, seen.get(kidTree))    return isPromise(kids) ? kids.then(processKids) : processKids(kids)  }   const processKids = (kids) => {    kids = (kids || []).filter(filter)    stack.push(...kids)  }   stack.push(tree)  return next()} const isPromise = p => p && typeof p.then === 'function' module.exports = depth