// !OPT_IN: kotlin.contracts.ExperimentalContracts // WITH_STDLIB // ISSUE: KT-51160 import kotlin.contracts.* sealed interface AsyncStatus { val value: T? data class Pending( override val value: T? = null, ) : AsyncStatus sealed interface Terminal : AsyncStatus data class Error( val error: Throwable, override val value: T? = null, ) : Terminal data class Success( override val value: T, ) : Terminal } fun AsyncStatus.isPending(): Boolean { contract { returns(true) implies (this@isPending is AsyncStatus.Pending) returns(false) implies (this@isPending is AsyncStatus.Terminal) } return (this is AsyncStatus.Pending) } fun AsyncStatus.isSuccess(): Boolean { contract { returns(true) implies (this@isSuccess is AsyncStatus.Success) } return (this is AsyncStatus.Success) } fun AsyncStatus.Terminal.isSuccess(): Boolean { contract { returns(true) implies (this@isSuccess is AsyncStatus.Success) returns(false) implies (this@isSuccess is AsyncStatus.Error) } return (this is AsyncStatus.Success) } fun AsyncStatus.isError(): Boolean { contract { returns(true) implies (this@isError is AsyncStatus.Error) } return (this is AsyncStatus.Error) } fun AsyncStatus.Terminal.isError(): Boolean { contract { returns(true) implies (this@isError is AsyncStatus.Error) returns(false) implies (this@isError is AsyncStatus.Success) } return (this is AsyncStatus.Error) } fun AsyncStatus.isTerminal(): Boolean { contract { returns(true) implies (this@isTerminal is AsyncStatus.Terminal) returns(false) implies (this@isTerminal is AsyncStatus.Pending) } return (this is AsyncStatus.Terminal) } fun main() { val foo = AsyncStatus.Pending() if (!foo.isPending()) { if (foo.isSuccess()) { nonNullPrint(foo.value) } if (foo.isError()) { foo.error.printStackTrace() } } } fun nonNullPrint(printMe: String) { println(printMe) }