From 9846e8098c42dc3e666a3f79bdaa84e05cf4c26f Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Tue, 15 Sep 2020 17:06:37 +0200 Subject: [PATCH] Create ChainableRunnables.kt --- .../kspigot/runnables/ChainableRunnables.kt | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/kotlin/net/axay/kspigot/runnables/ChainableRunnables.kt diff --git a/src/main/kotlin/net/axay/kspigot/runnables/ChainableRunnables.kt b/src/main/kotlin/net/axay/kspigot/runnables/ChainableRunnables.kt new file mode 100644 index 00000000..a3933691 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/runnables/ChainableRunnables.kt @@ -0,0 +1,52 @@ +@file:Suppress("MemberVisibilityCanBePrivate") + +package net.axay.kspigot.runnables + +import org.bukkit.Bukkit +import org.bukkit.plugin.Plugin + +/* + * Chainable bukkit runnable. + */ + +class ChainedRunnablePart( + val plugin: Plugin, + val runnable: (T?) -> R, + val sync: Boolean, + var previous: ChainedRunnablePart<*, T>? = null, + var next: ChainedRunnablePart? = null +) { + + fun execute() { + previous?.execute() ?: kotlin.run { start(null) } + } + + private fun start(data: T?) { + val realRunnable = Runnable { + val result = runnable.invoke(data) + next?.start(result) + } + if (sync) + Bukkit.getScheduler().runTask(plugin, realRunnable) + else + Bukkit.getScheduler().runTaskAsynchronously(plugin, realRunnable) + } + +} + +// FIRST +fun Plugin.firstDo(sync: Boolean, runnable: (Unit?) -> R) + = ChainedRunnablePart(this, runnable, sync) +fun Plugin.firstSync(runnable: (Unit?) -> R) = firstDo(true, runnable) +fun Plugin.firstAsync(runnable: (Unit?) -> R) = firstDo(false, runnable) + +// THEN +fun ChainedRunnablePart.thenDo(sync: Boolean, runnable: (R?) -> U): ChainedRunnablePart { + ChainedRunnablePart(plugin, runnable, sync).apply { + previous = this@thenDo + this@thenDo.next = this + return this + } +} +fun ChainedRunnablePart.thenSync(runnable: (R?) -> U) = thenDo(true, runnable) +fun ChainedRunnablePart.thenAsync(runnable: (R?) -> U) = thenDo(false, runnable) \ No newline at end of file