MicroUtils/coroutines/src/jvmMain/kotlin/dev/inmo/micro_utils/coroutines/LaunchSynchronously.kt

27 lines
985 B
Kotlin
Raw Normal View History

2020-12-02 11:28:59 +00:00
package dev.inmo.micro_utils.coroutines
import kotlinx.coroutines.*
2020-12-14 14:06:46 +00:00
fun <T> CoroutineScope.launchSynchronously(block: suspend CoroutineScope.() -> T): T {
2021-06-05 09:16:07 +00:00
var result: Result<T>? = null
val objectToSynchronize = Object()
synchronized(objectToSynchronize) {
2022-12-27 03:28:37 +00:00
launch(start = CoroutineStart.UNDISPATCHED) {
2021-06-05 09:16:07 +00:00
result = safelyWithResult(block)
}.invokeOnCompletion {
2020-12-02 11:28:59 +00:00
synchronized(objectToSynchronize) {
objectToSynchronize.notifyAll()
}
}
2021-06-05 09:16:07 +00:00
while (result == null) {
objectToSynchronize.wait()
}
2020-12-02 11:28:59 +00:00
}
2021-06-05 09:16:07 +00:00
return result!!.getOrThrow()
2020-12-02 11:28:59 +00:00
}
2020-12-14 14:06:46 +00:00
fun <T> launchSynchronously(block: suspend CoroutineScope.() -> T): T = CoroutineScope(Dispatchers.Default).launchSynchronously(block)
2021-05-10 13:20:57 +00:00
fun <T> CoroutineScope.doSynchronously(block: suspend CoroutineScope.() -> T): T = launchSynchronously(block)
fun <T> doSynchronously(block: suspend CoroutineScope.() -> T): T = launchSynchronously(block)