mirror of https://github.com/Minestom/Minestom.git
Add a Scheduler::scheduleTask with period supplier AND delay (#2082)
This commit is contained in:
parent
877e2bb4f2
commit
2442f14b3d
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue