es-grid-template
Version:
es-grid-template
53 lines (52 loc) • 1.49 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = makeRecursiveMapper;
var _isLeafNode = _interopRequireDefault(require("./isLeafNode"));
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 ((0, _isLeafNode.default)(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
};
}
};
}