@cloudcome/utils-core
Version:
cloudcome core utils
126 lines (125 loc) • 3.11 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const array = require("./array.cjs");
const type = require("./type.cjs");
function treeEach(treeList, iterator, breadthFist = false) {
const treeInfoList = [];
let returnFalse = false;
const iterate = (info) => {
if (iterator(info) === false) {
returnFalse = true;
return false;
}
};
const next = (info, walk2) => {
const { item, level, parent, path } = info;
const { children } = item;
if (type.isArray(children)) {
returnFalse = walk2({
...info,
parent: item,
list: children,
level: level + 1
}) === false;
}
};
const walk = (walker) => {
const { list, level, parent, path } = walker;
const path2 = [...path];
while (parent !== null && path2.length > 0 && path2[path2.length - 1] !== parent) {
path2.pop();
}
array.arrayEach(list, (item, index) => {
if (returnFalse) return false;
const info = {
...walker,
item,
index,
path: [...path2, item]
};
if (breadthFist) {
treeInfoList.push(info);
} else {
iterate(info);
if (returnFalse) return false;
next(info, walk);
}
});
if (breadthFist) {
while (!returnFalse) {
const info = treeInfoList.shift();
if (!info) break;
iterate(info);
if (returnFalse) break;
next(info, walk);
}
}
return !returnFalse;
};
walk({
list: treeList,
level: 1,
parent: null,
path: []
});
}
function treeFind(treeList, predicate, breadthFist = false) {
let found;
treeEach(
treeList,
(info) => {
if (predicate(info)) {
found = info;
return false;
}
},
breadthFist
);
return found;
}
function deepFlat(deepList, flatten, breadthFist = false) {
const list2 = [];
treeEach(
deepList,
(info) => {
list2.push(flatten(info));
},
breadthFist
);
return list2;
}
function treeFrom(list, options) {
const keyMap = /* @__PURE__ */ new Map();
const freeSet = /* @__PURE__ */ new Set();
const roots = [];
const assign = (info, isFirst = false) => {
const { selfKey, parentKey, item, index } = info;
if (type.isNullish(parentKey)) {
roots.push(item);
} else {
const parent = keyMap.get(parentKey);
if (type.isUndefined(parent)) {
if (isFirst) freeSet.add(info);
} else {
options.appendChild(parent, info);
}
}
};
array.arrayEach(list, (item, index) => {
const selfKey = options.getSelfKey(item, index);
const parentKey = options.getParentKey(item, index);
if (type.isNullish(selfKey)) return;
const info = { selfKey, parentKey, item, index };
keyMap.set(selfKey, info);
assign(info, true);
});
for (const info of freeSet.values()) {
assign(info);
}
return roots;
}
exports.deepFlat = deepFlat;
exports.treeEach = treeEach;
exports.treeFind = treeFind;
exports.treeFrom = treeFrom;
//# sourceMappingURL=tree.cjs.map
;