Skip to content

Commit

Permalink
Task builder API
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt-MX committed Jun 14, 2024
1 parent da6e5dc commit cb87aa7
Show file tree
Hide file tree
Showing 8 changed files with 202 additions and 9 deletions.
3 changes: 2 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions api/src/main/kotlin/com/mattmx/ktgui/scheduling/IteratingTask.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.mattmx.ktgui.scheduling

import org.bukkit.scheduler.BukkitTask

open class IteratingTask(
val task: BukkitTask
) {
/**
* How many times the task has repeated.
* Do not increment yourself.
*/
var iterations = 0

open fun cancel() = task.cancel()
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,10 @@ import org.bukkit.scheduler.BukkitTask
*/
class TaskTrackerTask(
private val owner: TaskTracker,
private val task: BukkitTask
) {
/**
* How many times the task has repeated.
* Do not increment yourself.
*/
var iterations = 0
task: BukkitTask
) : IteratingTask(task) {

fun cancel() {
override fun cancel() {
owner.removeTask(task)
task.cancel()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.mattmx.ktgui.scheduling.builder

import com.mattmx.ktgui.scheduling.*
import org.bukkit.scheduler.BukkitTask

class LaterTaskBuilder(
val isAsync: Boolean
) {
var delay = 0L
private set
lateinit var block: (IteratingTask) -> Unit
private set

infix fun delay(ticks: Long) = apply {
this.delay = ticks
}


infix fun runs(block: IteratingTask.() -> Unit) = apply {
this.block = block
}

fun run(): IteratingTask {
var task: IteratingTask? = null

val block: BukkitTask.() -> Unit = task@{
block.invoke(task!!)
task!!.iterations++
}

task = IteratingTask(if (isAsync) asyncDelayed(delay, block) else syncDelayed(delay, block))

return task
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.mattmx.ktgui.scheduling.builder

import com.mattmx.ktgui.scheduling.IteratingTask
import com.mattmx.ktgui.scheduling.asyncRepeat
import com.mattmx.ktgui.scheduling.syncRepeat
import org.bukkit.scheduler.BukkitTask

class RepeatingTaskBuilder(
val isAsync: Boolean
) {
var max = -1L
private set
var delay = 0L
private set
var period = 0L
private set
lateinit var block: (IteratingTask) -> Unit
private set

infix fun repeat(times: Long) = apply {
this.max = times
}

infix fun delay(ticks: Long) = apply {
this.delay = ticks
}

infix fun period(ticks: Long) = apply {
this.period = ticks
}

infix fun runs(block: IteratingTask.() -> Unit) = apply {
this.block = block
}

fun run(): IteratingTask {
var task: IteratingTask? = null

val block: BukkitTask.() -> Unit = task@{
if (task!!.iterations > max) {
cancel()
return@task
}

block.invoke(task!!)
task!!.iterations++
}

task = IteratingTask(if (isAsync) asyncRepeat(period, delay, block) else syncRepeat(period, delay, block))

return task
}
}
37 changes: 37 additions & 0 deletions api/src/main/kotlin/com/mattmx/ktgui/scheduling/builder/Task.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.mattmx.ktgui.scheduling.builder

import com.mattmx.ktgui.scheduling.asyncDelayed
import com.mattmx.ktgui.scheduling.asyncRepeat
import com.mattmx.ktgui.utils.seconds

object Task {

@JvmStatic
fun async() = AsyncTaskBuilder()

@JvmStatic
fun sync() = SyncTaskBuilder()
}

fun main() {
val repeating = Task
.async()
.repeating()
.repeat(20)
.delay(2.seconds)
.period(1)
.runs {
println("Task repeating $iterations")
}.run()

val later = Task
.sync()
.later()
.delay(1)
.runs {
println(iterations)
}.run()

val dsl = Task.async() repeating {
} period 2 delay 2 repeat 20
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.mattmx.ktgui.scheduling.builder

import com.mattmx.ktgui.scheduling.IteratingTask
import java.util.function.Consumer

interface TaskBuilder {

fun repeating() = RepeatingTaskBuilder(isAsync())

infix fun repeating(block: IteratingTask.() -> Unit) =
repeating().apply { runs(block) }

infix fun repeating(block: Consumer<IteratingTask>) =
repeating().apply { runs { block(this) } }

fun later() = LaterTaskBuilder(isAsync())

infix fun later(block: IteratingTask.() -> Unit) =
later().apply { runs(block) }

infix fun later(block: Consumer<IteratingTask>) =
later().apply { runs { block(this) } }

fun isAsync() : Boolean

}

class AsyncTaskBuilder : TaskBuilder {
override fun isAsync() = true
}

class SyncTaskBuilder : TaskBuilder {
override fun isAsync() = false
}
22 changes: 22 additions & 0 deletions plugin/src/main/java/com/mattmx/ktgui/examples/JavaScheduling.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.mattmx.ktgui.examples;

import com.mattmx.ktgui.scheduling.builder.Task;

public class JavaScheduling {
public void test() {
var repeating = Task.async()
.repeating((task) -> {
System.out.println("Ran this task " + task.getIterations() + " times.");
}).delay(2)
.period(2)
.repeat(20)
.run();

var later = Task.sync()
.later((task) -> {
System.out.println("1s later");
})
.delay(20)
.run();
}
}

0 comments on commit cb87aa7

Please sign in to comment.