diff --git a/orbit/src/main/java/com/babylon/orbit/BaseOrbitContainer.kt b/orbit/src/main/java/com/babylon/orbit/BaseOrbitContainer.kt index b75bf965..5652ca11 100644 --- a/orbit/src/main/java/com/babylon/orbit/BaseOrbitContainer.kt +++ b/orbit/src/main/java/com/babylon/orbit/BaseOrbitContainer.kt @@ -30,7 +30,7 @@ import java.util.concurrent.ExecutorService import java.util.concurrent.Executors class BaseOrbitContainer( - middleware: Middleware, + private val middleware: Middleware, initialStateOverride: STATE? = null ) : OrbitContainer { @@ -55,23 +55,23 @@ class BaseOrbitContainer( sideEffectSubject } + private fun getContext(actions: Observable) = OrbitContext( + { currentState }, + actions, + inputSubject, + ::reduce, + sideEffectSubject, + backgroundScheduler(middleware.configuration) + ) + init { disposables += inputSubject.doOnSubscribe { disposables += it } .observeOn(scheduler) .publish { actions -> - with( - OrbitContext( - { currentState }, - actions, - inputSubject, - ::reduce, - sideEffectSubject, - backgroundScheduler(middleware.configuration) - ) - ) { + with(getContext(actions)) { Observable.merge( - middleware.orbits.values.map { transformer -> - transformer() + middleware.orbits.values.map { transformers -> + transformers.last()() } ) } diff --git a/orbit/src/main/java/com/babylon/orbit/Middleware.kt b/orbit/src/main/java/com/babylon/orbit/Middleware.kt index f21928b0..a85c6523 100644 --- a/orbit/src/main/java/com/babylon/orbit/Middleware.kt +++ b/orbit/src/main/java/com/babylon/orbit/Middleware.kt @@ -18,7 +18,7 @@ package com.babylon.orbit interface Middleware { val initialState: STATE - val orbits: Map> + val orbits: Map>> val configuration: Config data class Config( @@ -30,7 +30,7 @@ interface Middleware { return object : Middleware { override val initialState: STATE get() = this@Middleware.initialState - override val orbits: Map> + override val orbits: Map>> get() = this@Middleware.orbits override val configuration: Config get() = this@Middleware.configuration.copy(testMode = true) @@ -41,7 +41,7 @@ interface Middleware { return object : Middleware { override val initialState: STATE get() = this@Middleware.initialState - override val orbits: Map> + override val orbits: Map>> get() = this@Middleware.orbits.filter { it.key == flow } override val configuration: Config get() = this@Middleware.configuration.copy(testMode = true) diff --git a/orbit/src/main/java/com/babylon/orbit/OrbitsBuilder.kt b/orbit/src/main/java/com/babylon/orbit/OrbitsBuilder.kt index 380b8d7e..7251348b 100644 --- a/orbit/src/main/java/com/babylon/orbit/OrbitsBuilder.kt +++ b/orbit/src/main/java/com/babylon/orbit/OrbitsBuilder.kt @@ -22,7 +22,7 @@ import io.reactivex.rxkotlin.ofType @OrbitDsl open class OrbitsBuilder(private val initialState: STATE) { private val orbits = - mutableMapOf.() -> Observable<*>>() + mutableMapOf.() -> Observable<*>>>() private val descriptions = mutableSetOf() private val config = ConfigReceiver() @@ -86,6 +86,11 @@ open class OrbitsBuilder(private val initialStat private val description: String, private val upstreamTransformer: OrbitContext.() -> Observable ) { + init { + this@OrbitsBuilder.orbits[description] = + (this@OrbitsBuilder.orbits[description] ?: emptyList.() -> Observable<*>>()) + + upstreamTransformer + } /** * Transform allows you to apply a series of RxJava operators in order to transform the original @@ -104,7 +109,6 @@ open class OrbitsBuilder(private val initialStat upstreamTransformer().observeOn(backgroundScheduler) ).transformer() } - .also { this@OrbitsBuilder.orbits[description] = it.upstreamTransformer } /** * Side effects allow you to deal with things like tracking, navigation etc. @@ -179,7 +183,7 @@ open class OrbitsBuilder(private val initialStat }.map { event } // To be removed to make reducers emit the state } .observeOn(backgroundScheduler) - }.also { this@OrbitsBuilder.orbits[description] = it.upstreamTransformer } + } private fun doOnNextTransformer(func: OrbitContext.(EVENT) -> Unit) = this@OrbitsBuilder.Transformer( @@ -189,7 +193,7 @@ open class OrbitsBuilder(private val initialStat .doOnNext { func(it) } - }.also { this@OrbitsBuilder.orbits[description] = it.upstreamTransformer } + } } fun build() = object : Middleware { @@ -197,7 +201,7 @@ open class OrbitsBuilder(private val initialStat sideEffectCachingEnabled = config.sideEffectCachingEnabled ) override val initialState: STATE = this@OrbitsBuilder.initialState - override val orbits: Map> = + override val orbits: Map>> = this@OrbitsBuilder.orbits } }