Add a Scheduler::scheduleTask with period supplier AND delay (#2082)

This commit is contained in:
Samuel 2024-04-09 17:25:17 -04:00 committed by GitHub
parent 877e2bb4f2
commit 2442f14b3d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 5 deletions

View File

@ -68,6 +68,10 @@ public sealed interface Scheduler extends Executor permits SchedulerImpl, Schedu
return scheduleTask(task, delay, repeat, ExecutionType.TICK_START);
}
default @NotNull Task scheduleTask(@NotNull Supplier<TaskSchedule> task, @NotNull TaskSchedule delay) {
return new Task.Builder(this, task).delay(delay).schedule();
}
default @NotNull Task scheduleNextTick(@NotNull Runnable task, @NotNull ExecutionType executionType) {
return buildTask(task).delay(TaskSchedule.nextTick()).executionType(executionType).schedule();
}

View File

@ -26,14 +26,23 @@ public sealed interface Task permits TaskImpl {
final class Builder {
private final Scheduler scheduler;
private final Runnable runnable;
private final Supplier<TaskSchedule> innerTask;
private ExecutionType executionType = ExecutionType.TICK_START;
private TaskSchedule delay = TaskSchedule.immediate();
private TaskSchedule repeat = TaskSchedule.stop();
private boolean repeatOverride;
Builder(Scheduler scheduler, Supplier<TaskSchedule> innerTask) {
this.scheduler = scheduler;
this.innerTask = innerTask;
}
Builder(Scheduler scheduler, Runnable runnable) {
this.scheduler = scheduler;
this.runnable = runnable;
this.innerTask = () -> {
runnable.run();
return TaskSchedule.stop();
};
}
public @NotNull Builder executionType(@NotNull ExecutionType executionType) {
@ -48,13 +57,15 @@ public sealed interface Task permits TaskImpl {
public @NotNull Builder repeat(@NotNull TaskSchedule schedule) {
this.repeat = schedule;
this.repeatOverride = true;
return this;
}
public @NotNull Task schedule() {
var runnable = this.runnable;
var innerTask = this.innerTask;
var delay = this.delay;
var repeat = this.repeat;
var repeatOverride = this.repeatOverride;
var executionType = this.executionType;
return scheduler.submitTask(new Supplier<>() {
boolean first = true;
@ -65,8 +76,11 @@ public sealed interface Task permits TaskImpl {
first = false;
return delay;
}
runnable.run();
return repeat;
TaskSchedule schedule = innerTask.get();
if (repeatOverride) {
return repeat;
}
return schedule;
}
}, executionType);
}