import java.util.Arrays;
public class TaskCarousel {
private int count = 0;
private int executed = 0;
private final Task[] carousel;
public TaskCarousel(int capacity) {
carousel = new Task[capacity];
}
public boolean addTask(Task task) {
if (task == null || task.isFinished() || isFull()){
return false;
}
else {
carousel[count] = task;
count++;
return true;
}
}
public boolean execute() {
if (executed > carousel.length - 1){
executed = executed - (carousel.length - 1);
}
// Use a loop to find the next non-null and non-finished task to execute
// If none is found, return false
for (int i = 0; i < carousel.length; i++) {
// Use modulo to wrap around the array in a circular order
executed = (executed + 1) % carousel.length;
if (carousel[executed] != null && !carousel[executed].isFinished()) {
// Execute the task and check if it is finished
carousel[executed].execute();
if (carousel[executed].isFinished()) {
// Set the finished task to null and decrement the count
carousel[executed] = null;
count--;
// Shift the remaining tasks to fill up the empty space
// This will preserve the execution order
for (int j = executed; j < count; j++) {
carousel[j] = carousel[j + 1];
}
// Set the last element to null to avoid duplication
carousel[count] = null;
// Decrement the executed index to account for the shift
executed--;
}
// Return true after executing a task
return true;
}
}
// Return false if no task was executed
return false;
}
}