private MobiusLoop()

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));
  }