package j4ckall.rxflux.lib.flux; import java.util.Objects; import io.reactivex.Observable; import io.reactivex.functions.Consumer; import io.reactivex.subjects.PublishSubject; import io.reactivex.subjects.Subject; /** * ActionをトリガーにしてdispatcherSubjectを購読しているStoreにデータを流す * * @author matsumoto_k */ public class Dispatcher { private final Subject<Action> dispatcherSubject = PublishSubject.<Action>create().toSerialized(); private final Observable<Action> dispatch = dispatcherSubject.hide(); public Dispatcher() { } /** * dispatcherSubjectを購読する * * @param key * @param subscriber * @return */ final Observable<Action> on(Action.Key key, Consumer<Action> subscriber) { return dispatcherSubject.filter(fluxAction -> Objects.equals(fluxAction.key, key)) .doOnNext(subscriber); } /** * dispatcherSubjectを購読しているStoreにデータを流す * * @param fluxAction */ final void dispatch(Action fluxAction) { dispatcherSubject.onNext(fluxAction); } /** * dispatcherSubjectは公開したくない(外部からonNext出来る)ので * Observableに変換して返す * * @return Observable<Action> */ public Observable<Action> getDispatch() { return dispatch; } }