Files
HMCL/HMCLAPI/src/main/java/rx/subjects/Subject.java

58 lines
1.8 KiB
Java
Raw Normal View History

package rx.subjects;
import java.util.concurrent.ConcurrentHashMap;
import rx.Observable;
import rx.Observer;
import rx.Subscription;
import rx.util.AtomicObservableSubscription;
import rx.util.SynchronizedObserver;
import rx.util.functions.Func1;
public class Subject<T> extends Observable<T> implements Observer<T> {
2015-12-29 20:35:40 +08:00
public static <T> Subject<T> create() {
2015-12-29 20:35:40 +08:00
final ConcurrentHashMap<Subscription, Observer<T>> observers = new ConcurrentHashMap<>();
2015-12-29 20:35:40 +08:00
Func1<Observer<T>, Subscription> onSubscribe = observer -> {
final AtomicObservableSubscription subscription = new AtomicObservableSubscription();
2015-12-29 20:35:40 +08:00
subscription.wrap(() -> {
// on unsubscribe remove it from the map of outbound observers to notify
observers.remove(subscription);
});
2015-12-29 20:35:40 +08:00
// on subscribe add it to the map of outbound observers to notify
observers.put(subscription, new SynchronizedObserver<>(observer, subscription));
return subscription;
};
2015-12-29 20:35:40 +08:00
return new Subject<>(onSubscribe, observers);
}
private final ConcurrentHashMap<Subscription, Observer<T>> observers;
protected Subject(Func1<Observer<T>, Subscription> onSubscribe, ConcurrentHashMap<Subscription, Observer<T>> observers) {
super(onSubscribe);
this.observers = observers;
}
@Override
public void onCompleted() {
2015-12-29 20:35:40 +08:00
for (Observer<T> observer : observers.values())
observer.onCompleted();
}
@Override
public void onError(Exception e) {
2015-12-29 20:35:40 +08:00
for (Observer<T> observer : observers.values())
observer.onError(e);
}
@Override
public void onNext(T args) {
2015-12-29 20:35:40 +08:00
for (Observer<T> observer : observers.values())
observer.onNext(args);
}
}