sealed interface Loadable { val isLoading: Boolean }
sealed interface Cacheable { val cachedAt: Long? }
// Data classes can implement BOTH sealed interfaces simultaneously
data class FreshData(
val payload: String,
override val isLoading: Boolean = false,
override val cachedAt: Long? = null,
) : Loadable, Cacheable
data class StaleData(
val payload: String,
override val isLoading: Boolean = false,
override val cachedAt: Long, // required
) : Loadable, Cacheable
fun displayLabel(d: Loadable): String = when (d) {
is FreshData -> "fresh: ${d.payload}"
is StaleData -> "stale (cached ${d.cachedAt}): ${d.payload}"
}
fun main() {
println(displayLabel(FreshData("hi")))
println(displayLabel(StaleData("hi", cachedAt = 12345L)))
}
Create a free account and build your private vault. Share publicly whenever you want.