es-grid-template
Version:
es-grid-template
46 lines • 1.26 kB
JavaScript
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
};
}
};
}