Task Scheduling

A task in ID can be only executed and completed if all the dependency tasks are completed.

const schedules = [
  { id: "a", dependencies: ["b", "c"] },
  { id: "b", dependencies: ["d"] },
  { id: "c", dependencies: ["e"] },
  { id: "d", dependencies: [] },
  { id: "e", dependencies: ["f"] },
  { id: "f", dependencies: [] },
];

const schedules = [
  { id: "a", dependencies: ["b", "c"] },
  { id: "b", dependencies: ["d"] },
  { id: "c", dependencies: ["e"] },
  { id: "d", dependencies: [] },
  { id: "e", dependencies: ["c"] },
  { id: "f", dependencies: [] },
];
let totalTasks = schedules.length;
let completedTasks = 0;
let currentTask = 0;

function clearTaskFromScheduleDependencies(id) {
  schedules.forEach((task) => {
    let index = task.dependencies.indexOf(id);
    if (index !== -1) {
      task.dependencies.splice(index, 1);
    }
  });
}

function executeTask() {
  while (completedTasks < totalTasks) {
    const task = schedules[currentTask];
    if (task.dependencies.length === 0 && !task.executed) {
      console.log(task.id);
      task.executed = true;
      completedTasks += 1;
      clearTaskFromScheduleDependencies(task.id);
    } else if (!task.visited) {
      task.visited = 1;
    } else if (task.visited > totalTasks) {
      console.log("Cycle Detected");
      break;
    } else {
      task.visited += 1;
    }

    if (currentTask === totalTasks - 1) currentTask = 0;
    else currentTask += 1;
  }
}

executeTask();

// Output 1:
d
f
b
e
c
a

// Output 2:
d
f
b
Cycle Detected