import { StepInfoNode } from "../model/tactic/Tactic" export function addStepNode( root: StepInfoNode, parent: StepInfoNode, child: StepInfoNode, ): StepInfoNode { if (root.id === parent.id) { return { ...root, children: root.children.concat(child), } } return { ...root, children: root.children.map((c) => addStepNode(c, parent, child)), } } export function removeStepNode( root: StepInfoNode, node: StepInfoNode, ): StepInfoNode | null { if (root.id === node.id) { return null } return { ...root, children: root.children.flatMap((child) => { const result = removeStepNode(child, node) return result ? [result] : [] }), } } /** * Returns an available identifier that is not already present into the given node tree * @param root */ export function getAvailableId(root: StepInfoNode): number { const acc = (root: StepInfoNode): number => Math.max(root.id, ...root.children.map(acc)) return acc(root) + 1 } export function getParent( root: StepInfoNode, node: StepInfoNode, ): StepInfoNode | null { if (root.children.find((n) => n.id === node.id)) return root for (const child of root.children) { const result = getParent(child, node) if (result != null) { return result } } return null }