package it.cavallium.warppi.flow; import java.util.LinkedList; import java.util.List; import java.util.function.Function; import org.apache.commons.lang3.tuple.Pair; public abstract class Observable implements ObservableSource { protected List> subscribers = new LinkedList<>(); public Disposable subscribe() { return null; } public Disposable subscribe(Action1 onNext) { return subscribe(createSubscriber(onNext)); } protected Observable.DisposableOfSubscriber createDisposable(Subscriber sub) { return new DisposableOfSubscriber(sub); } public Disposable subscribe(Action1 onNext, Action1 onError) { return subscribe(createSubscriber(onNext, onError)); } public Disposable subscribe(Action1 onNext, Action1 onError, Action0 onCompleted) { return subscribe(createSubscriber(onNext, onError, onCompleted)); } public void subscribe(Observer obs) { subscribe(createSubscriber(obs)); } public Disposable subscribe(Subscriber sub) { subscribers.add(sub); return createDisposable(sub); } protected Subscriber createSubscriber(Action1 onNext) { return new Subscriber() { @Override public void onSubscribe(Subscription s) {} public void onNext(T t) { onNext.call(t); } }; } protected Subscriber createSubscriber(Action1 onNext, Action1 onError) { return new Subscriber() { @Override public void onSubscribe(Subscription s) {} public void onNext(T t) { onNext.call(t); } @Override public void onError(Throwable t) { onError.call(t); } }; } protected Subscriber createSubscriber(Action1 onNext, Action1 onError, Action0 onCompl) { return new Subscriber() { @Override public void onSubscribe(Subscription s) {} public void onNext(T t) { onNext.call(t); } @Override public void onError(Throwable t) { onError.call(t); } @Override public void onComplete() { onCompl.call(); } }; } protected Subscriber createSubscriber(Observer obs) { return new Subscriber() { @Override public void onSubscribe(Subscription s) {} public void onNext(T t) { obs.onNext(t); } @Override public void onError(Throwable t) { obs.onError(t); } @Override public void onComplete() { obs.onComplete(); } }; } public static final Observable merge(Observable a, Observable b) { return new ObservableMerged<>(a, b); } @Deprecated public static final Observable of(Observable a) { return null; } public final Observable map(Function f) { return new ObservableMap(this, f); } public static final Observable> combineLatest(Observable a, Observable b) { return new ObservableCombinedLatest<>(a, b); } public static final Observable> combineChanged(Observable a, Observable b) { return new ObservableCombinedChanged<>(a, b); } public static final Observable> zip(Observable a, Observable b) { return new ObservableZipped<>(a, b); } public static final Observable interval(long interval) { return new ObservableInterval(interval); } protected class DisposableOfSubscriber implements Disposable { private final Subscriber sub; public DisposableOfSubscriber(Subscriber sub) { this.sub = sub; } protected Subscriber getSubscriber() { return sub; } protected Observable getObservable() { return Observable.this; } @Override public void dispose() { if (isDisposed()) { throw new RuntimeException("Already disposed!"); } subscribers.remove(sub); Observable.this.onDisposed(sub); } @Override public boolean isDisposed() { return !subscribers.contains(sub); } } public Observable doOnNext(Action1 onNext) { Subject onNextSubject = BehaviorSubject.create(); this.subscribe((val) -> { onNext.call(val); onNextSubject.onNext(val); }); return onNextSubject; } public void onDisposed(Subscriber sub) { } }