diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/utility/highlevel_try_finally/safe_autoclose.kt b/src/commonMain/kotlin/ru/landgrafhomyak/utility/highlevel_try_finally/safe_autoclose.kt index 54f9208..6d6ed32 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/utility/highlevel_try_finally/safe_autoclose.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/utility/highlevel_try_finally/safe_autoclose.kt @@ -1,18 +1,16 @@ package ru.landgrafhomyak.utility.highlevel_try_finally -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract - -inline fun safeAutoClose(onError: () -> Unit = {}, onSuccess: () -> Unit = {}, action: () -> R): R { - contract { - callsInPlace(action, InvocationKind.EXACTLY_ONCE) - callsInPlace(onError, InvocationKind.AT_MOST_ONCE) - callsInPlace(onSuccess, InvocationKind.EXACTLY_ONCE) - } +fun safeAutoClose( + onError: () -> Unit = {}, + onSuccess: () -> Unit = {}, + action: () -> R +): R { val ret: R var wasError = false + var crossReturned = true try { ret = action() + crossReturned = false } catch (e1: Throwable) { wasError = true try { @@ -22,8 +20,11 @@ inline fun safeAutoClose(onError: () -> Unit = {}, onSuccess: () -> Unit = { } throw e1 } finally { - if (!wasError) + if (!wasError) { + if (crossReturned) + throw Error("crossreturn") onSuccess() + } } return ret -} \ No newline at end of file +}