UNPKG

es-grid-template

Version:

es-grid-template

46 lines 1.26 kB
import isLeafNode from "./isLeafNode"; export default function makeRecursiveMapper(fn) { return tree => { return dfs(tree, 0, []).result; function dfs(nodes, parentStartIndex, path) { let flatCount = 0; const result = []; for (const node of nodes) { path.push(node); const startIndex = parentStartIndex + flatCount; let subResult; if (isLeafNode(node)) { subResult = fn(node, { startIndex, endIndex: startIndex + 1, path: path.slice(), isLeaf: true }); flatCount += 1; } else { const dfsResult = dfs(node.children, startIndex, path); subResult = fn({ ...node, children: dfsResult.result }, { startIndex, endIndex: startIndex + dfsResult.flatCount, path: path.slice(), isLeaf: false }); flatCount += dfsResult.flatCount; } if (Array.isArray(subResult)) { result.push(...subResult); } else if (subResult != null) { result.push(subResult); } path.pop(); } return { result, flatCount }; } }; }