package dev.inmo.micro_utils.coroutines import kotlinx.coroutines.* fun CoroutineScope.launchSynchronously(block: suspend CoroutineScope.() -> T): T { var result: Result? = null val objectToSynchronize = Object() synchronized(objectToSynchronize) { launch(start = CoroutineStart.UNDISPATCHED) { result = safelyWithResult(block) }.invokeOnCompletion { synchronized(objectToSynchronize) { objectToSynchronize.notifyAll() } } while (result == null) { objectToSynchronize.wait() } } return result!!.getOrThrow() } fun launchSynchronously(block: suspend CoroutineScope.() -> T): T = CoroutineScope(Dispatchers.Default).launchSynchronously(block) fun CoroutineScope.doSynchronously(block: suspend CoroutineScope.() -> T): T = launchSynchronously(block) fun doSynchronously(block: suspend CoroutineScope.() -> T): T = launchSynchronously(block)