package nucleus.presenter.delivery;
import rx.Notification;
import rx.Observable;
import rx.Subscription;
import rx.functions.Action0;
import rx.functions.Func1;
import rx.subjects.ReplaySubject;
public class DeliverReplay<View, T> implements Observable.Transformer<T, Delivery<View, T>> {
private final Observable<View> view;
public DeliverReplay(Observable<View> view) {
this.view = view;
}
@Override
public Observable<Delivery<View, T>> call(Observable<T> observable) {
final ReplaySubject<Notification<T>> subject = ReplaySubject.create();
final Subscription subscription = observable
.materialize()
.filter(new Func1<Notification<T>, Boolean>() {
@Override
public Boolean call(Notification<T> notification) {
return !notification.isOnCompleted();
}
})
.subscribe(subject);
return view
.switchMap(new Func1<View, Observable<Delivery<View, T>>>() {
@Override
public Observable<Delivery<View, T>> call(final View view) {
return view == null ? Observable.<Delivery<View, T>>never() : subject
.map(new Func1<Notification<T>, Delivery<View, T>>() {
@Override
public Delivery<View, T> call(Notification<T> notification) {
return new Delivery<>(view, notification);
}
});
}
})
.doOnUnsubscribe(new Action0() {
@Override
public void call() {
subscription.unsubscribe();
}
});
}
}