From 15146e02aa125b8d05edd0a73571fcc5548ff351 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Mon, 24 Feb 2025 02:15:53 +0300 Subject: [PATCH] [history] Copied bahaviour of AutoCloseable.use{} without dependency on interface --- .../highlevel_try_finally/safe_autoclose.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/utility/highlevel_try_finally/safe_autoclose.kt 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 new file mode 100644 index 0000000..53bd308 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/utility/highlevel_try_finally/safe_autoclose.kt @@ -0,0 +1,23 @@ +package ru.landgrafhomyak.utility.highlevel_try_finally + +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract + +inline fun safeAutoClose(onError: () -> Unit = {}, action: () -> R): R { + contract { + callsInPlace(action, InvocationKind.EXACTLY_ONCE) + callsInPlace(onError, InvocationKind.AT_MOST_ONCE) + } + val ret: R + try { + ret = action() + } catch (e1: Throwable) { + try { + onError() + } catch (e2: Throwable) { + e1.addSuppressed(e2) + } + throw e1 + } + return ret +} \ No newline at end of file