Files
Firmament/src/main/kotlin/moe/nea/firmament/util/async/input.kt
2023-08-01 00:06:19 +02:00

52 lines
1.5 KiB
Kotlin

/*
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package moe.nea.firmament.util.async
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
import moe.nea.firmament.events.HandledScreenKeyPressedEvent
import moe.nea.firmament.keybindings.IKeyBinding
private object InputHandler {
data class KeyInputContinuation(val keybind: IKeyBinding, val onContinue: () -> Unit)
private val activeContinuations = mutableListOf<KeyInputContinuation>()
fun registerContinuation(keyInputContinuation: KeyInputContinuation): () -> Unit {
synchronized(InputHandler) {
activeContinuations.add(keyInputContinuation)
}
return {
synchronized(this) {
activeContinuations.remove(keyInputContinuation)
}
}
}
init {
HandledScreenKeyPressedEvent.subscribe { event ->
synchronized(InputHandler) {
val toRemove = activeContinuations.filter {
event.matches(it.keybind)
}
toRemove.forEach { it.onContinue() }
activeContinuations.removeAll(toRemove)
}
}
}
}
suspend fun waitForInput(keybind: IKeyBinding): Unit = suspendCancellableCoroutine { cont ->
val unregister =
InputHandler.registerContinuation(InputHandler.KeyInputContinuation(keybind) { cont.resume(Unit) })
cont.invokeOnCancellation {
unregister()
}
}