diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bde96b2fca..9120f045a2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.5.6 + +* `Versions` + * `Exposed`: `0.31.1` -> `0.32.1` +* `Coroutines` + * `JVM` + * `launchSynchronously` and subsequent functions got improved mechanism + * New method `safelyWithResult` + ## 0.5.5 * `Versions` diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/HandleSafely.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/HandleSafely.kt index f84e6cdb8e1..8fb0d3ad3f9 100644 --- a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/HandleSafely.kt +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/HandleSafely.kt @@ -115,6 +115,10 @@ suspend inline fun runCatchingSafely( safely(onException, block) } +suspend inline fun safelyWithResult( + noinline block: suspend CoroutineScope.() -> T +): Result = runCatchingSafely(defaultSafelyExceptionHandler, block) + /** * Use this handler in cases you wish to include handling of exceptions by [defaultSafelyWithoutExceptionHandler] and * returning null at one time diff --git a/coroutines/src/jvmMain/kotlin/dev/inmo/micro_utils/coroutines/LaunchSynchronously.kt b/coroutines/src/jvmMain/kotlin/dev/inmo/micro_utils/coroutines/LaunchSynchronously.kt index d5142fcba7f..e4fb735da36 100644 --- a/coroutines/src/jvmMain/kotlin/dev/inmo/micro_utils/coroutines/LaunchSynchronously.kt +++ b/coroutines/src/jvmMain/kotlin/dev/inmo/micro_utils/coroutines/LaunchSynchronously.kt @@ -3,27 +3,21 @@ package dev.inmo.micro_utils.coroutines import kotlinx.coroutines.* fun CoroutineScope.launchSynchronously(block: suspend CoroutineScope.() -> T): T { - val deferred = CompletableDeferred() - val objectToSynchronize = java.lang.Object() - val launchCallback = { + var result: Result? = null + val objectToSynchronize = Object() + synchronized(objectToSynchronize) { launch { - safely( - { - deferred.completeExceptionally(it) - } - ) { - deferred.complete(block()) - } + result = safelyWithResult(block) + }.invokeOnCompletion { synchronized(objectToSynchronize) { objectToSynchronize.notifyAll() } } + while (result == null) { + objectToSynchronize.wait() + } } - synchronized(objectToSynchronize) { - launchCallback() - objectToSynchronize.wait() - } - return deferred.getCompleted() + return result!!.getOrThrow() } fun launchSynchronously(block: suspend CoroutineScope.() -> T): T = CoroutineScope(Dispatchers.Default).launchSynchronously(block) diff --git a/gradle.properties b/gradle.properties index fe778f06412..5d03522015e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ org.gradle.jvmargs=-Xmx2g kotlin_version=1.5.10 kotlin_coroutines_version=1.5.0 kotlin_serialisation_core_version=1.2.1 -kotlin_exposed_version=0.31.1 +kotlin_exposed_version=0.32.1 ktor_version=1.6.0 @@ -45,5 +45,5 @@ dokka_version=1.4.32 # Project data group=dev.inmo -version=0.5.5 -android_code_version=46 +version=0.5.6 +android_code_version=47