Android architecture
Kotlin version of RxFeedback
The simplest architecture for RxJava
typealias Feedback<State, Event> = (Observable<State>) -> Observable<Event>
fun <State, Event> system(
initialState: State,
reduce: (State, Event) -> State,
vararg feedback: Feedback<State, Event>
): Observable<State>
Straightforward
Declarative
Debugging is easier
Can be applied on any level
system
operator)system
operator inside feedback loop)Works awesome with dependency injection
Testing
Can model circular dependencies
Completely separates business logic from effects (Rx).
Observables.system(initialState = 0,
reduce = { state, event: Event ->
when (event) {
Event.Increment -> state + 1
Event.Decrement -> state - 1
}
},
scheduler = AndroidSchedulers.mainThread(),
scheduledFeedback = listOf(
bind {
val subscriptions = listOf(
it.source.map { it.toString() }.subscribe { label.text = it }
)
val events = listOf(
RxView.clicks(plus).map { Event.Increment },
RxView.clicks(minus).map { Event.Decrement }
)
return@bind Bindings(subscriptions, events)
}
)
)
Simple automatic feedback loop.
Observables.system(
initialState = State.HumanHasIt,
reduce = { state, event: Event ->
when (event) {
Event.ThrowToMachine -> State.MachineHasIt
Event.ThrowToHuman -> State.HumanHasIt
}
},
scheduler = AndroidSchedulers.mainThread(),
scheduledFeedback = listOf(
bindUI,
react<State, Unit, Event>(query = { it.machinePitching},
effects = {
Observable.timer(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.map { Event.ThrowToHuman }
}
)
)
)
Driver.system(
initialState = State.empty,
reduce = { state: State, event: Event -> State.reduce(state, event) },
feedback = listOf(bindUI,
reactSafe<State, String, Event>(
query = { it.loadNextPage },
effects = {
repositoryService.getSearchRepositoriesResponse(it)
.asSignal(onError = Signal.just(Result.Failure(GitHubServiceError.Offline) as SearchRepositoriesResponse))
.map { Event.Response(it) }
}
)))
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Add the dependency
implementation 'com.github.NoTests:RxFeedback.kt:x.y.z'