Skip to content
This repository has been archived by the owner on Dec 30, 2020. It is now read-only.

Commit

Permalink
Merge pull request #88 from babylonhealth/orbit-1-interaction
Browse files Browse the repository at this point in the history
[PDT-701] Made orbit 1 flows easier to change for testing
  • Loading branch information
Rosomack authored Jun 29, 2020
2 parents e1447e4 + d409c33 commit ef09da7
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 21 deletions.
26 changes: 13 additions & 13 deletions orbit/src/main/java/com/babylon/orbit/BaseOrbitContainer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors

class BaseOrbitContainer<STATE : Any, SIDE_EFFECT : Any>(
middleware: Middleware<STATE, SIDE_EFFECT>,
private val middleware: Middleware<STATE, SIDE_EFFECT>,
initialStateOverride: STATE? = null
) : OrbitContainer<STATE, SIDE_EFFECT> {

Expand All @@ -55,23 +55,23 @@ class BaseOrbitContainer<STATE : Any, SIDE_EFFECT : Any>(
sideEffectSubject
}

private fun getContext(actions: Observable<Any>) = 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()()
}
)
}
Expand Down
6 changes: 3 additions & 3 deletions orbit/src/main/java/com/babylon/orbit/Middleware.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ package com.babylon.orbit

interface Middleware<STATE : Any, SIDE_EFFECT : Any> {
val initialState: STATE
val orbits: Map<String, TransformerFunction<STATE, SIDE_EFFECT>>
val orbits: Map<String, List<TransformerFunction<STATE, SIDE_EFFECT>>>
val configuration: Config

data class Config(
Expand All @@ -30,7 +30,7 @@ interface Middleware<STATE : Any, SIDE_EFFECT : Any> {
return object : Middleware<STATE, SIDE_EFFECT> {
override val initialState: STATE
get() = this@Middleware.initialState
override val orbits: Map<String, TransformerFunction<STATE, SIDE_EFFECT>>
override val orbits: Map<String, List<TransformerFunction<STATE, SIDE_EFFECT>>>
get() = this@Middleware.orbits
override val configuration: Config
get() = this@Middleware.configuration.copy(testMode = true)
Expand All @@ -41,7 +41,7 @@ interface Middleware<STATE : Any, SIDE_EFFECT : Any> {
return object : Middleware<STATE, SIDE_EFFECT> {
override val initialState: STATE
get() = this@Middleware.initialState
override val orbits: Map<String, TransformerFunction<STATE, SIDE_EFFECT>>
override val orbits: Map<String, List<TransformerFunction<STATE, SIDE_EFFECT>>>
get() = this@Middleware.orbits.filter { it.key == flow }
override val configuration: Config
get() = this@Middleware.configuration.copy(testMode = true)
Expand Down
14 changes: 9 additions & 5 deletions orbit/src/main/java/com/babylon/orbit/OrbitsBuilder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import io.reactivex.rxkotlin.ofType
@OrbitDsl
open class OrbitsBuilder<STATE : Any, SIDE_EFFECT : Any>(private val initialState: STATE) {
private val orbits =
mutableMapOf<String, OrbitContext<STATE, SIDE_EFFECT>.() -> Observable<*>>()
mutableMapOf<String, List<OrbitContext<STATE, SIDE_EFFECT>.() -> Observable<*>>>()
private val descriptions = mutableSetOf<String>()

private val config = ConfigReceiver()
Expand Down Expand Up @@ -86,6 +86,11 @@ open class OrbitsBuilder<STATE : Any, SIDE_EFFECT : Any>(private val initialStat
private val description: String,
private val upstreamTransformer: OrbitContext<STATE, SIDE_EFFECT>.() -> Observable<EVENT>
) {
init {
this@OrbitsBuilder.orbits[description] =
(this@OrbitsBuilder.orbits[description] ?: emptyList<OrbitContext<STATE, SIDE_EFFECT>.() -> Observable<*>>()) +
upstreamTransformer
}

/**
* Transform allows you to apply a series of RxJava operators in order to transform the original
Expand All @@ -104,7 +109,6 @@ open class OrbitsBuilder<STATE : Any, SIDE_EFFECT : Any>(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.
Expand Down Expand Up @@ -179,7 +183,7 @@ open class OrbitsBuilder<STATE : Any, SIDE_EFFECT : Any>(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<STATE, SIDE_EFFECT>.(EVENT) -> Unit) =
this@OrbitsBuilder.Transformer(
Expand All @@ -189,15 +193,15 @@ open class OrbitsBuilder<STATE : Any, SIDE_EFFECT : Any>(private val initialStat
.doOnNext {
func(it)
}
}.also { this@OrbitsBuilder.orbits[description] = it.upstreamTransformer }
}
}

fun build() = object : Middleware<STATE, SIDE_EFFECT> {
override val configuration = Middleware.Config(
sideEffectCachingEnabled = config.sideEffectCachingEnabled
)
override val initialState: STATE = this@OrbitsBuilder.initialState
override val orbits: Map<String, TransformerFunction<STATE, SIDE_EFFECT>> =
override val orbits: Map<String, List<TransformerFunction<STATE, SIDE_EFFECT>>> =
this@OrbitsBuilder.orbits
}
}
Expand Down

0 comments on commit ef09da7

Please sign in to comment.