40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
import type {PhaseNode} from "../pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.tsx";
|
|
|
|
/**
|
|
* takes an array of phaseNodes and orders them according to their nextPhaseId attributes,
|
|
* starting with the phase that has isFirstPhase = true
|
|
*
|
|
* @param {PhaseNode[]} nodes an unordered phaseNode array
|
|
* @returns {PhaseNode[]} the ordered phaseNode array
|
|
*/
|
|
export default function orderPhaseNodeArray(nodes: PhaseNode[]) : PhaseNode[] {
|
|
// find the first phaseNode of the sequence
|
|
const start = nodes.find(node => node.data.isFirstPhase);
|
|
if (!start) {
|
|
throw new Error('No phaseNode with isFirstObject = true found');
|
|
}
|
|
|
|
// prepare for ordering of phaseNodes
|
|
const orderedPhaseNodes: PhaseNode[] = [];
|
|
const IdMap = new Map(nodes.map(node => [node.id, node]));
|
|
let currentNode: PhaseNode | undefined = start;
|
|
|
|
// populate orderedPhaseNodes array with the phaseNodes in the correct order
|
|
while (currentNode) {
|
|
orderedPhaseNodes.push(currentNode);
|
|
|
|
if (!currentNode.data.nextPhaseId) {
|
|
throw new Error("Incomplete phase sequence, program does not reach the end node");
|
|
}
|
|
|
|
if (currentNode.data.nextPhaseId === "end") break;
|
|
|
|
currentNode = IdMap.get(currentNode.data.nextPhaseId);
|
|
|
|
if (!currentNode) {
|
|
throw new Error(`Incomplete phase sequence, phaseNode with id "${orderedPhaseNodes.at(-1)?.data.nextPhaseId}" not found`);
|
|
}
|
|
}
|
|
|
|
return orderedPhaseNodes;
|
|
} |