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 53bd308..54f9208 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 @@ -3,21 +3,27 @@ package ru.landgrafhomyak.utility.highlevel_try_finally import kotlin.contracts.InvocationKind import kotlin.contracts.contract -inline fun <R> safeAutoClose(onError: () -> Unit = {}, action: () -> R): R { +inline fun <R> 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) } val ret: R + var wasError = false try { ret = action() } catch (e1: Throwable) { + wasError = true try { onError() } catch (e2: Throwable) { e1.addSuppressed(e2) } throw e1 + } finally { + if (!wasError) + onSuccess() } return ret } \ No newline at end of file