You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

39 lines
754 B
JavaScript

"use strict";
const isIterable = require("is-iterable");
const map = require("../map");
// FIXME: Untested
module.exports = function treeMap(tree, mapper, options = {}) {
let key = options.key ?? "children";
let recurseAfterMap = options.recurseAfterMap ?? false;
function next(value) {
if (isIterable(value)) {
return map(value, (item) => step(item));
} else if (value != null && typeof value === "object") {
return step(value);
} else {
return value;
}
}
function step(subtree) {
if (recurseAfterMap) {
let mapped = mapper(subtree);
mapped[key] = next(mapped[key]);
return mapped;
} else {
let input = {
... subtree,
[key]: next(subtree)
};
return mapper(input);
}
}
return next(tree);
};