sealed interface Load<out T> { data class Ok<T>(val value: T) : Load<T> data class Fail(val error: Throwable) : Load<Nothing> data object Loading : Load<Nothing> } fun <T> Load<T>.valueOr(fallback: T): T = when (this) { is Load.Ok -> value else -> fallback }