All files / src/utils orderPhaseNodes.ts

0% Statements 0/18
0% Branches 0/8
0% Functions 0/3
0% Lines 0/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40                                                                               
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;
}