{"ast":null,"code":"import { IndexerL2R } from \"./IAdapter\";\nexport class TreeNode {\n  constructor(data = undefined, parent = undefined, name) {\n    this._parent = void 0;\n    this._children = void 0;\n    this.name = void 0;\n    this.data = void 0;\n    this._parent = parent;\n    this._children = undefined;\n    this.name = name;\n    this.data = data;\n\n    if (this._parent !== undefined) {\n      this._parent.addChild(this);\n    }\n  }\n  /**\r\n   * 判断某个节点是不是当前节点的祖先节点\r\n   * @param ancestor \r\n   * @returns \r\n   */\n\n\n  isDescendantOf(ancestor) {\n    if (ancestor === undefined) {\n      return false;\n    } //从当前节点向上遍历\n    //let node: TreeNode<T> | undefined = this._parent; //不明白为啥要添加这句\n\n\n    for (let node = this._parent; node !== undefined; node = (_node = node) === null || _node === void 0 ? void 0 : _node._parent) {\n      var _node;\n\n      if (node === ancestor) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  getChildAt(index) {\n    if (this._children === undefined) {\n      return undefined;\n    }\n\n    if (index < 0 || index > this._children.length) {\n      return undefined;\n    }\n\n    return this._children[index];\n  }\n\n  removeChildAt(index) {\n    if (this._children === undefined) {\n      return undefined;\n    }\n\n    let child = this.getChildAt(index);\n\n    if (child === undefined) {\n      return undefined;\n    }\n\n    this._children.splice(index, 1);\n\n    child._parent = undefined;\n    return child;\n  }\n\n  removeChild(child) {\n    if (child === undefined) {\n      return undefined;\n    }\n\n    if (this._children === undefined) {\n      return undefined;\n    }\n\n    let index = -1;\n\n    for (let i = 0; i < this._children.length; i++) {\n      if (this.getChildAt(i) === child) {\n        index = i;\n        break;\n      }\n    }\n\n    if (index === -1) {\n      return undefined;\n    }\n\n    return this.removeChildAt(index);\n  }\n  /**\r\n   * 把当前节点在父节点中删除\r\n   */\n\n\n  remove() {\n    if (this._parent !== undefined) {\n      return this._parent.removeChild(this);\n    }\n\n    return undefined;\n  }\n\n  addChildAt(child, index) {\n    //第一种情况,如果child是本节点的祖先节点,是不允许的\n    if (this.isDescendantOf(child)) {\n      return undefined;\n    } //延迟初始化的处理\n\n\n    if (this._children === undefined) {\n      this._children = [];\n    }\n\n    if (index >= 0 && index <= this._children.length) {\n      //第二种情况,child已经是别人的子节点,那要先去除和别人的关系\n      if (child._parent !== undefined) {\n        child._parent.removeChild(child);\n      } //第三种情况 正常情况\n\n\n      child._parent = this;\n\n      this._children.splice(index, 0, child);\n\n      return child;\n    } else {\n      return undefined;\n    }\n  }\n\n  addChild(child) {\n    if (this._children === undefined) {\n      this._children = [];\n    }\n\n    return this.addChildAt(child, this._children.length);\n  }\n\n  get parent() {\n    return this._parent;\n  }\n\n  get childCount() {\n    if (this._children !== undefined) {\n      return this._children.length;\n    }\n\n    return 0;\n  }\n\n  hasChild() {\n    return this._children !== undefined && this._children.length > 0;\n  }\n\n  get root() {\n    let curr = this;\n\n    while (curr !== undefined && curr._parent !== undefined) {\n      curr = curr._parent;\n    }\n\n    return curr;\n  }\n\n  get depth() {\n    let curr = this;\n    let level = 0;\n\n    while (curr !== undefined && curr._parent !== undefined) {\n      curr = curr._parent;\n      level++;\n    }\n\n    return level;\n  }\n\n  repeatString(target, n) {\n    let total = \"\";\n\n    for (let i = 0; i < n; i++) {\n      total += target;\n    }\n\n    return total;\n  }\n\n  visit(preOrderFunc = null, postOrderFunc = null, indexFunc = IndexerL2R) {\n    if (preOrderFunc !== null) {\n      preOrderFunc(this);\n    }\n\n    let arr = this._children;\n\n    if (arr !== undefined) {\n      for (let i = 0; i < arr.length; i++) {\n        let child = this.getChildAt(indexFunc(arr.length, i));\n\n        if (child !== undefined) {\n          child.visit(preOrderFunc, postOrderFunc, indexFunc);\n        }\n      }\n    }\n\n    if (postOrderFunc !== null) {\n      postOrderFunc(this);\n    }\n  }\n\n}","map":{"version":3,"sources":["/home/blobt/Documents/dev/node/triangle/src/render/TreeNode.ts"],"names":["IndexerL2R","TreeNode","constructor","data","undefined","parent","name","_parent","_children","addChild","isDescendantOf","ancestor","node","getChildAt","index","length","removeChildAt","child","splice","removeChild","i","remove","addChildAt","childCount","hasChild","root","curr","depth","level","repeatString","target","n","total","visit","preOrderFunc","postOrderFunc","indexFunc","arr"],"mappings":"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","sourcesContent":["import { Indexer, IndexerL2R } from \"./IAdapter\";\r\n\r\nexport type NodeCallback<T> = (node: TreeNode<T>) => void;\r\nexport class TreeNode<T> {\r\n    private _parent: TreeNode<T> | undefined;\r\n    private _children: Array<TreeNode<T>> | undefined;\r\n    public name: string;\r\n    public data: T | undefined;\r\n\r\n    public constructor(data: T | undefined = undefined, parent: TreeNode<T> | undefined = undefined, name: string) {\r\n        this._parent = parent;\r\n        this._children = undefined;\r\n        this.name = name;\r\n        this.data = data;\r\n        if (this._parent !== undefined) {\r\n            this._parent.addChild(this);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * 判断某个节点是不是当前节点的祖先节点\r\n     * @param ancestor \r\n     * @returns \r\n     */\r\n    public isDescendantOf(ancestor: TreeNode<T> | undefined): boolean {\r\n        if (ancestor === undefined) {\r\n            return false;\r\n        }\r\n        //从当前节点向上遍历\r\n        //let node: TreeNode<T> | undefined = this._parent; //不明白为啥要添加这句\r\n        for (let node: TreeNode<T> | undefined = this._parent; node !== undefined; node = node?._parent) {\r\n            if (node === ancestor) {\r\n                return true;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n\r\n    public getChildAt(index: number): TreeNode<T> | undefined {\r\n        if (this._children === undefined) {\r\n            return undefined;\r\n        }\r\n        if (index < 0 || index > this._children.length) {\r\n            return undefined;\r\n        }\r\n        return this._children[index];\r\n    }\r\n\r\n    public removeChildAt(index: number): TreeNode<T> | undefined {\r\n        if (this._children === undefined) {\r\n            return undefined;\r\n        }\r\n        let child: TreeNode<T> | undefined = this.getChildAt(index);\r\n        if (child === undefined) {\r\n            return undefined;\r\n        }\r\n        this._children.splice(index, 1);\r\n        child._parent = undefined;\r\n        return child;\r\n    }\r\n\r\n    public removeChild(child: TreeNode<T> | undefined): TreeNode<T> | undefined {\r\n        if (child === undefined) {\r\n            return undefined;\r\n        }\r\n        if (this._children === undefined) {\r\n            return undefined;\r\n        }\r\n        let index: number = -1;\r\n        for (let i = 0; i < this._children.length; i++) {\r\n            if (this.getChildAt(i) === child) {\r\n                index = i;\r\n                break;\r\n            }\r\n        }\r\n        if (index === -1) {\r\n            return undefined;\r\n        }\r\n        return this.removeChildAt(index);\r\n    }\r\n\r\n    /**\r\n     * 把当前节点在父节点中删除\r\n     */\r\n    public remove(): TreeNode<T> | undefined {\r\n        if (this._parent !== undefined) {\r\n            return this._parent.removeChild(this);\r\n        }\r\n        return undefined;\r\n    }\r\n\r\n    public addChildAt(child: TreeNode<T>, index: number): TreeNode<T> | undefined {\r\n        //第一种情况,如果child是本节点的祖先节点,是不允许的\r\n        if (this.isDescendantOf(child)) {\r\n            return undefined;\r\n        }\r\n\r\n        //延迟初始化的处理\r\n        if (this._children === undefined) {\r\n            this._children = [];\r\n        }\r\n\r\n        if (index >= 0 && index <= this._children.length) {\r\n            //第二种情况,child已经是别人的子节点,那要先去除和别人的关系\r\n            if (child._parent !== undefined) {\r\n                child._parent.removeChild(child);\r\n            }\r\n\r\n            //第三种情况 正常情况\r\n            child._parent = this;\r\n            this._children.splice(index, 0, child);\r\n            return child;\r\n        } else {\r\n            return undefined;\r\n        }\r\n    }\r\n\r\n    public addChild(child: TreeNode<T>): TreeNode<T> | undefined {\r\n        if (this._children === undefined) {\r\n            this._children = [];\r\n        }\r\n        return this.addChildAt(child, this._children.length);\r\n    }\r\n\r\n    public get parent(): TreeNode<T> | undefined {\r\n        return this._parent;\r\n    }\r\n\r\n    public get childCount(): number {\r\n        if (this._children !== undefined) {\r\n            return this._children.length;\r\n        }\r\n        return 0;\r\n    }\r\n\r\n    public hasChild(): boolean {\r\n        return this._children !== undefined && this._children.length > 0;\r\n    }\r\n\r\n    public get root(): TreeNode<T> | undefined {\r\n        let curr: TreeNode<T> | undefined = this;\r\n        while (curr !== undefined && curr._parent !== undefined) {\r\n            curr = curr._parent;\r\n        }\r\n        return curr;\r\n    }\r\n\r\n    public get depth(): number {\r\n        let curr: TreeNode<T> | undefined = this;\r\n        let level: number = 0;\r\n\r\n        while (curr !== undefined && curr._parent !== undefined) {\r\n            curr = curr._parent;\r\n            level++;\r\n        }\r\n\r\n        return level;\r\n    }\r\n    public repeatString(target: string, n: number): string {\r\n        let total: string = \"\";\r\n        for (let i = 0; i < n; i++) {\r\n            total += target;\r\n        }\r\n        return total;\r\n    }\r\n    public visit(preOrderFunc: NodeCallback<T> | null = null, postOrderFunc: NodeCallback<T> | null = null, indexFunc: Indexer = IndexerL2R): void {\r\n        if (preOrderFunc !== null) {\r\n            preOrderFunc(this);\r\n        }\r\n\r\n        let arr: Array<TreeNode<T>> | undefined = this._children;\r\n        if (arr !== undefined) {\r\n            for (let i: number = 0; i < arr.length; i++) {\r\n                let child: TreeNode<T> | undefined = this.getChildAt(indexFunc(arr.length, i));\r\n                if(child !== undefined){\r\n                    child.visit(preOrderFunc, postOrderFunc, indexFunc);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (postOrderFunc !== null) {\r\n            postOrderFunc(this);\r\n        }\r\n    }\r\n}"]},"metadata":{},"sourceType":"module"}