in mobius-core/src/main/java/com/spotify/mobius/MobiusLoop.java [88:155]
private MobiusLoop(
EventProcessor.Factory<M, E, F> eventProcessorFactory,
M startModel,
Iterable<F> startEffects,
Connectable<F, E> effectHandler,
Connectable<M, E> eventSource,
WorkRunner eventRunner,
WorkRunner effectRunner) {
onEventReceived =
DiscardAfterDisposeWrapper.wrapConsumer(
new Consumer<E>() {
@Override
public void accept(E event) {
eventProcessor.update(event);
}
});
onEffectReceived =
DiscardAfterDisposeWrapper.wrapConsumer(
new Consumer<F>() {
@Override
public void accept(F effect) {
try {
effectConsumer.accept(effect);
} catch (Throwable t) {
throw new ConnectionException(effect, t);
}
}
});
eventSourceModelConsumer = new QueuingConnection<>();
Consumer<M> onModelChanged =
new Consumer<M>() {
@Override
public void accept(M model) {
mostRecentModel = model;
eventSourceModelConsumer.accept(model);
for (Consumer<M> observer : modelObservers) {
observer.accept(model);
}
}
};
this.eventDispatcher = new MessageDispatcher<>(eventRunner, onEventReceived);
this.effectDispatcher = new MessageDispatcher<>(effectRunner, onEffectReceived);
this.eventProcessor = eventProcessorFactory.create(effectDispatcher, onModelChanged);
Consumer<E> eventConsumer =
new Consumer<E>() {
@Override
public void accept(E event) {
dispatchEvent(event);
}
};
this.effectConsumer = effectHandler.connect(eventConsumer);
mostRecentModel = startModel;
onModelChanged.accept(startModel);
for (F effect : startEffects) {
effectDispatcher.accept(effect);
}
this.eventSourceModelConsumer.setDelegate(eventSource.connect(eventConsumer));
}