sealed class MainActivityViewState(val loading: Boolean, val message: String?, val errorMessage: String?) { class Success(val name: String): MainActivityViewState(false, name, null) class Loading : MainActivityViewState(true, null, null) class Error(errorMessage: String) : MainActivityViewState(false, null, errorMessage) } repository.loadPerson("1") .map { personData -> MainActivityViewState.Success(personData.name) } .onErrorReturn { error -> MainActivityViewState.Error(error.localizedMessage) } .startWith { MainActivityViewState.Loading() } .subscribe({ state -> view.render(state) }, { throwable -> throw IllegalStateException() })