@file:Suppress("MemberVisibilityCanBePrivate") package net.axay.kspigot.runnables import net.axay.kspigot.main.KSpigotMainInstance import org.bukkit.Bukkit /* * Chainable bukkit runnable. */ class ChainedRunnablePart( 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(KSpigotMainInstance, realRunnable) else Bukkit.getScheduler().runTaskAsynchronously(KSpigotMainInstance, realRunnable) } } // FIRST fun firstDo(sync: Boolean, runnable: (Unit?) -> R) = ChainedRunnablePart(runnable, sync) fun firstSync(runnable: (Unit?) -> R) = firstDo(true, runnable) fun firstAsync(runnable: (Unit?) -> R) = firstDo(false, runnable) // THEN fun ChainedRunnablePart.thenDo(sync: Boolean, runnable: (R?) -> U): ChainedRunnablePart { ChainedRunnablePart(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)