interface ItemRemoteSource { fun get(id: String): Single fun getAll(): Single> } interface ItemRemoteSink { fun create(item: Item): Single fun update(item: Item): Single fun delete(id: String): Single }
interface ItemLocalSource { fun get(id: String): Single> fun getAll(): Single>> } interface ItemLocalSink { fun create(item: Item): Single fun update(item: Item): Single fun delete(id: String): Single }
sealed class LocalResult { abstract fun get(): T class Present(private val value: T): LocalResult() { override fun get(): T = value } class Obsolete(private val value: T): LocalResult() { override fun get(): T = value } class NotFound: LocalResult() { override fun get(): T = throw Resources.NotFoundException("No value") } }
interface ItemGlobalSource { fun get(id: String): Single fun getAll(): Single> } interface ItemGlobalSink { fun create(item: Item): Single fun update(item: Item): Single fun delete(id: String): Single }
fun LocalResult>.notFountIfEmpty() : LocalResult> { return if (this is LocalResult.NotFound || get().isNotEmpty()) { This } else { LocalResult.NotFound() } }
● Measure your network usage ● Test your own application with lousy network conditions ● Test your own application in airplane mode ● Use your own application