From b2a5ac9292213ed17b2d868d8662be53b9754eae Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Wed, 19 Mar 2025 00:37:46 +0300 Subject: [PATCH] [history] Added functions that passes thrown exception to 'onError' block --- .../highlevel_try_finally/safe_autoclose.kt | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) 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 239852a..16f5a43 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 @@ -29,6 +29,21 @@ inline fun safeAutoClose2( return safeAutoClose3(onError = onError, onSuccess = onSuccess, onCrossReturn = onSuccess, action = action) } +inline fun safeAutoClose2e( + onError: (Throwable) -> Unit = {}, + onSuccess: () -> Unit = {}, + action: () -> R +): R { + @Suppress("WRONG_INVOCATION_KIND") + contract { + callsInPlace(action, InvocationKind.EXACTLY_ONCE) + callsInPlace(onError, InvocationKind.AT_MOST_ONCE) + callsInPlace(onSuccess, InvocationKind.AT_MOST_ONCE) + } + return safeAutoClose3e(onError = onError, onSuccess = onSuccess, onCrossReturn = onSuccess, action = action) +} + + inline fun safeAutoClose3( onError: () -> Unit = {}, onSuccess: () -> Unit = {}, @@ -41,6 +56,21 @@ inline fun safeAutoClose3( callsInPlace(onSuccess, InvocationKind.AT_MOST_ONCE) callsInPlace(onCrossReturn, InvocationKind.AT_MOST_ONCE) } + return safeAutoClose3e(onError = { t -> onError() }, onSuccess = onSuccess, onCrossReturn = onCrossReturn, action = action) +} + +inline fun safeAutoClose3e( + onError: (Throwable) -> Unit = {}, + onSuccess: () -> Unit = {}, + onCrossReturn: () -> Unit = {}, + action: () -> R +): R { + contract { + callsInPlace(action, InvocationKind.EXACTLY_ONCE) + callsInPlace(onError, InvocationKind.AT_MOST_ONCE) + callsInPlace(onSuccess, InvocationKind.AT_MOST_ONCE) + callsInPlace(onCrossReturn, InvocationKind.AT_MOST_ONCE) + } val ret: R var wasError = false @@ -51,7 +81,7 @@ inline fun safeAutoClose3( } catch (e1: Throwable) { wasError = true try { - onError() + onError(e1) } catch (e2: Throwable) { e1.addSuppressed(e2) }