Skip to content

Instantly share code, notes, and snippets.

@jumperson
Created February 15, 2018 01:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jumperson/1b21f95477477d46cdd5b48a439ea473 to your computer and use it in GitHub Desktop.
Save jumperson/1b21f95477477d46cdd5b48a439ea473 to your computer and use it in GitHub Desktop.
Reactor Android
abstract class Reactor<in Action, Mutation, State, Navigation>(state: State) {
private val actionSubject: Subject<Action> = PublishSubject.create()
private val initialViewState = state
var currentViewState = initialViewState
private set
val stateStream: Observable<State>
init {
val mutationsStream = actionSubject.flatMap { mutate(it) }.replay().refCount()
stateStream = mutationsStream
.scan(initialViewState) { state, mutation -> reduce(state, mutation) }
.startWith(initialViewState)
.doOnNext { currentViewState = it }
}
fun onAction(action: Action) = actionSubject.onNext(action)
abstract fun mutate(action: Action): Observable<Mutation>
abstract fun reduce(state: State, mutation: Mutation): State
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment