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)
|