You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.4 KiB
62 lines
1.4 KiB
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
|
|
}
|