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); 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) { default @NotNull Task scheduleNextTick(@NotNull Runnable task, @NotNull ExecutionType executionType) {
return buildTask(task).delay(TaskSchedule.nextTick()).executionType(executionType).schedule(); return buildTask(task).delay(TaskSchedule.nextTick()).executionType(executionType).schedule();
} }

View File

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