"use strict"; const isIterable = require("is-iterable"); const forEach = require("../for-each"); module.exports = function treeMap(tree, mapper, options = {}) { let key = options.key ?? "children"; let recurseAfterMap = options.recurseAfterMap ?? false; let results = []; function step(subtree) { let mapped = mapper(subtree); results.push(mapped); let nextChildren = (recurseAfterMap) ? mapped[key] : subtree[key]; if (isIterable(nextChildren)) { forEach(nextChildren, step); } else if (nextChildren != null && typeof nextChildren === "object") { step(nextChildren); } } if (isIterable(tree)) { forEach(tree, step); } else { step(tree); } return results; };