Skip to content

Instantly share code, notes, and snippets.

View Laimiux's full-sized avatar

Laimonas Turauskas Laimiux

View GitHub Profile
interface DataRepository {
Observable<Lce<Data>> getDataEventStream();
}
Observable<Lce<Data>> getDataEventStream() {
return api.getData()
.map(data -> Lce.data(data))
.startWith(Lce.loading())
.onErrorReturn(e -> Lce.error(e))
}
class UserManager {
Observable<Lce<User>> getUserEventStream() {
return updateEventStream().startWith(cachedBundle().map(toLce()))
}
}
class StoreRepository {
Observable<Lce<List<Store>> getStoreEventStream() {
return userBundleManager.switchMap { bundleEvent ->
if (bundleEvent.isLoading()) {
return Observable.just(Lce.loading())
} else if (bundleEvent.hasError()) {
return Observable.just(Lce.error(bundleEvent.getError()))
} else {
// Stores can come from cached source or network
return storeListEventStream(bundleEvent.data.getZipCode())
class UserContent {
// requires both the user and list of published content
}
Observable<Lce<User>> getUserEventStream(String userId);
Observable<Lce<List<Content>> getContentEventStream(String userId);
Observable<Lce<UserContent>> getProfileEventStream(String id) {
return Observable.combineLatest(
getUserEventStream(id),
public void onAttach(View view) {
repository.getLatestDataStream().subscribe({ data ->
view.showData(data)
})
}
@Laimiux
Laimiux / commonrx.java
Last active April 23, 2017 11:04
Common rx data loading
public void onAttach(View view) {
view.showLoading(true)
repository.getData().subscribe({ data ->
view.showLoading(false)
view.showData(data)
}, { error ->
view.showLoading(false)
// should we have a retry action?
view.showError("boo!")
})
// Lce -> Loading / Content / Error
class Lce<T> {
public static <T> Lce<T> data(T data) {
// implementation
}
public static <T> Lce<T> error(Throwable error) {
// implementation
}
public static <T> Lce<T> loading() {
// implementation
final PublishRelay<String> refreshRelay = PublishRelay.create()
void refreshData() {
refreshRelay.call("refresh event")
}
Observable<Lce<Data>> getDataEventStream() {
return refreshRelay
.startWith("initial")
.switchMap { event ->
public void onAttach(View view) {
// Remember to clean the subscription!
repository.getDataEventStream().subscribe({ event ->
if (event.isLoading) {
view.showLoading(true)
} else if (event.hasError()) {
view.showError(event.getError())
} else {
view.showData(event.getData())
}