{"version":3,"sources":["../src/tree/tree.ts"],"names":["_treeObj","_options","FlexTree","nodes","options","__privateAdd","__privateSet","__privateGet","isNothing","forEachTreeByDfs","node","parent","index","level","path","nodeId","getById","nodeData","refNodeId","pos","idKey","childrenKey","refNodeInfo","getTreeNodeInfo","refNode","children","removeTreeNodes","moveTreeNode","matcher","picker","matchOne","searchTree"],"mappings":"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","file":"chunk-RF2EUNAQ.mjs","sourcesContent":[" \nimport { isNothing } from \"../typecheck/isNothing\";\nimport type { IForEachTreeCallback } from \"./forEachTree\";\nimport { getById } from \"./getById\";\nimport { getTreeNodeInfo } from \"./getTreeNodeInfo\";\nimport { moveTreeNode, MoveTreeNodePosition } from \"./moveTreeNode\";\nimport { removeTreeNodes } from \"./removeTreeNodes\";\nimport { searchTree, SerachTreeOptions } from \"./searchTree\";\nimport { TreeNode, TreeNodeBase, TreeNodeOptions } from \"./types\";\nimport { forEachTreeByDfs } from \"./forEachTreeByDfs\";\n\nexport interface FlexTreeOptions<Node extends TreeNodeBase = TreeNode,IdKey extends string = \"id\"> extends TreeNodeOptions {\n    idGenerator(node:Partial<Node>):Node[IdKey]\n}\n\nexport class FlexTree<Node extends TreeNodeBase = TreeNode,IdKey extends string = \"id\",ChildrenKey extends string = \"children\">{\n    #treeObj:Node[] | Node\n    #options:FlexTreeOptions<Node,IdKey>\n    constructor(nodes:Node[] | Node,options?:FlexTreeOptions<Node,IdKey>){\n        this.#treeObj = nodes\n        this.#options = Object.assign({},options) as Required<FlexTreeOptions<Node,IdKey>>\n    }\n    get root(): Node | undefined {\n        return Array.isArray(this.#treeObj) ? undefined : this.#treeObj\n    }\n    get nodes(): Node[]{\n        return Array.isArray(this.#treeObj) ? this.#treeObj : (isNothing(this.#treeObj) ? [] : [this.#treeObj])\n    }\n    [Symbol.iterator](){        \n        type ParamsType = Parameters<IForEachTreeCallback<Node>>[0] \n        let nodes:ParamsType[] = []\n        forEachTreeByDfs<Node>(this.#treeObj,({node,parent,index,level,path})=>{\n            nodes.push({node,parent,index,level,path})\n        },this.#options)\n        let index = 0\n        return {\n            next: function ():{value: Parameters<IForEachTreeCallback<Node>>[0] ,done:boolean} {\n              return {\n                value: nodes[index++],\n                done: index > nodes.length\n              };\n            }\n          };        \n    }\n    /**\n     * 返回指定id的节点\n     * @param nodeId \n     * @returns \n     */\n    getNode(nodeId:Node[IdKey]):Node | null{\n        return getById<Node,IdKey>(this.#treeObj,nodeId,this.#options)\n    }\n    addNode(nodeData: Partial<Node> ,refNodeId:Node[IdKey],pos:MoveTreeNodePosition = MoveTreeNodePosition.LastChild):Node {\n        const {idKey='id',childrenKey='children'} = this.#options        \n        if(isNothing(nodeData[idKey])) {\n            if(typeof this.#options.idGenerator === 'function'){\n                (nodeData as any)[idKey] = this.#options.idGenerator(nodeData)\n            }\n            if(isNothing(nodeData[idKey])){\n                throw new Error(\"必须指定有效的节点ID\")\n            }            \n        }\n        let refNodeInfo =  getTreeNodeInfo<Node,IdKey>(this.#treeObj,refNodeId,this.#options)\n        if(refNodeInfo){\n            let { parent,node:refNode,index}  = refNodeInfo\n            if(pos==MoveTreeNodePosition.FirstChild){\n                if(!(childrenKey in (refNode as Node))) (refNode as any)[childrenKey] = [];\n                (refNode as any)[childrenKey].splice(0,0,nodeData)\n            }else if(pos==MoveTreeNodePosition.LastChild){\n                if(!(childrenKey in (refNode as Node))) (refNode as any)[childrenKey] = [];\n                (refNode as any)[childrenKey].push(nodeData)\n            }else if(pos==MoveTreeNodePosition.Next){\n                let children : Node[] \n                if(isNothing(parent)){// 根节点\n                    this.#treeObj =Array.isArray(this.#treeObj) ? this.#treeObj : [this.#treeObj as Node]\n                    children = this.#treeObj \n                    index = 0\n                }else{\n                    children = (parent as Node)[childrenKey]\n                }\n                children.splice(index+1 ,0,nodeData as Node)\n            }else if(pos==MoveTreeNodePosition.Previous){\n                let children : Node[] \n                if(isNothing(parent)){// 根节点\n                    this.#treeObj =Array.isArray(this.#treeObj) ? this.#treeObj : [this.#treeObj as Node]\n                    children = this.#treeObj \n                    index = 0\n                }else{\n                    children = (parent as Node)[childrenKey]\n                }\n                children.splice(index>0 ? index-1 : 0 ,0,nodeData as Node)\n            }else{\n                throw new TypeError()\n            }\n       }\n       return nodeData as  Node\n    }\n    removeNode(nodeId:Node[IdKey]):void {      \n        const {idKey='id',childrenKey='children'} = this.#options\n       removeTreeNodes<Node>(this.#treeObj,({node})=>{\n            if(node[idKey] ==  nodeId){\n                return true\n            }\n        },{\n            onlyRemoveOne:true,\n            ...this.#options\n        })\n    }\n    moveNode(nodeId: Node[IdKey],refNodeId:Node[IdKey],pos:MoveTreeNodePosition){\n        return moveTreeNode<Node,IdKey>(this.#treeObj,nodeId,refNodeId,pos,this.#options) \n    }\n    /**\n     * 搜索节点\n     */\n    search(matcher:IForEachTreeCallback<Node>,picker?:IForEachTreeCallback<Node>,options?:SerachTreeOptions){\n        const { matchOne } = options as Required<SerachTreeOptions>\n        return searchTree<Node,Node[]>(this.#treeObj,matcher,picker,{\n            matchOne,\n            ...this.#options\n        })\n    }\n}"]}