UNPKG

@cloudcome/utils-core

Version:
126 lines (125 loc) 3.11 kB
"use strict"; 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