????JFIF??x?x????'
Server IP : 79.136.114.73 / Your IP : 216.73.216.221 Web Server : Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.29 OpenSSL/1.0.1f System : Linux b8009 3.13.0-170-generic #220-Ubuntu SMP Thu May 9 12:40:49 UTC 2019 x86_64 User : www-data ( 33) PHP Version : 5.5.9-1ubuntu4.29 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/local/lib/node_modules/npm/node_modules/treeverse/lib/ |
Upload File : |
// 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 = (tree) => { if (seen.has(tree)) return seen.get(tree) seen.set(tree, null) const res = visit ? visit(tree) : tree if (isPromise(res)) { const fullResult = res.then(res => { seen.set(tree, res) return kidNodes(tree) }) seen.set(tree, fullResult) return fullResult } else { seen.set(tree, res) return kidNodes(tree) } } const kidNodes = (tree) => { const kids = getChildren(tree, seen.get(tree)) 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