From 1b9bf5e49f60d1aae4af2ecbb475de9c2d53828c Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Tue, 25 Feb 2025 01:24:33 +0300 Subject: [PATCH] [history] Added try-else behaviour --- .../utility/highlevel_try_finally/safe_autoclose.kt | 8 +++++++- 1 file changed, 7 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 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 safeAutoClose(onError: () -> Unit = {}, action: () -> R): R { +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) } 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