c7435ba760
We are going to deprecate `WITH_RUNTIME` directive. The main reason behind this change is that `WITH_STDLIB` directive better describes its meaning, specifically it will add kotlin stdlib to test's classpath.
38 lines
876 B
Kotlin
Vendored
38 lines
876 B
Kotlin
Vendored
// !OPT_IN: kotlin.contracts.ExperimentalContracts
|
|
// WITH_STDLIB
|
|
|
|
import kotlin.contracts.ExperimentalContracts
|
|
import kotlin.contracts.InvocationKind
|
|
import kotlin.contracts.contract
|
|
|
|
|
|
data class Content<out T>(val value: T)
|
|
|
|
fun <T> content(value: T) = Content(value)
|
|
|
|
@ExperimentalContracts
|
|
inline fun <R, T : R> Content<T>.getOrElse(
|
|
onException: (exception: Exception) -> R,
|
|
): R = fold({ it }, onException)
|
|
|
|
@ExperimentalContracts
|
|
inline fun <R, T> Content<T>.fold(
|
|
onContent: (value: T) -> R,
|
|
onException: (exception: Exception) -> R,
|
|
): R {
|
|
contract {
|
|
callsInPlace(onContent, InvocationKind.AT_MOST_ONCE)
|
|
callsInPlace(onException, InvocationKind.AT_MOST_ONCE)
|
|
}
|
|
return onContent(value)
|
|
}
|
|
|
|
|
|
@ExperimentalContracts
|
|
fun box(): String {
|
|
val t = content(1).getOrElse { 2 }
|
|
if (t != 1) return "Failed: $t"
|
|
|
|
return "OK"
|
|
}
|