[history] Added contracts and changed names to avoid ambiguous calls

This commit is contained in:
Andrew Golovashevich 2025-03-18 20:28:29 +03:00
parent 586e825693
commit 6f9d3bdd32

View File

@ -1,22 +1,47 @@
package ru.landgrafhomyak.utility.highlevel_try_finally package ru.landgrafhomyak.utility.highlevel_try_finally
inline fun <R> safeAutoClose( import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
inline fun <R> safeAutoClose1(
finally: () -> Unit, finally: () -> Unit,
action: () -> R action: () -> R
): R = safeAutoClose(onError = finally, onSuccess = finally, onCrossReturn = finally, action = action) ): R {
@Suppress("WRONG_INVOCATION_KIND")
contract {
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
callsInPlace(finally, InvocationKind.EXACTLY_ONCE)
}
return safeAutoClose3(onError = finally, onSuccess = finally, onCrossReturn = finally, action = action)
}
inline fun <R> safeAutoClose( inline fun <R> safeAutoClose2(
onError: () -> Unit = {}, onError: () -> Unit = {},
onSuccess: () -> Unit = {}, onSuccess: () -> Unit = {},
action: () -> R action: () -> R
): R = safeAutoClose(onError = onError, onSuccess = onSuccess, onCrossReturn = onSuccess, action = action) ): R {
@Suppress("WRONG_INVOCATION_KIND")
contract {
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
callsInPlace(onError, InvocationKind.AT_MOST_ONCE)
callsInPlace(onSuccess, InvocationKind.AT_MOST_ONCE)
}
return safeAutoClose3(onError = onError, onSuccess = onSuccess, onCrossReturn = onSuccess, action = action)
}
inline fun <R> safeAutoClose( inline fun <R> safeAutoClose3(
onError: () -> Unit = {}, onError: () -> Unit = {},
onSuccess: () -> Unit = {}, onSuccess: () -> Unit = {},
onCrossReturn: () -> Unit = {}, onCrossReturn: () -> Unit = {},
action: () -> R action: () -> R
): 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 val ret: R
var wasError = false var wasError = false
var crossReturned = true var crossReturned = true