danfma
04/25/2017, 8:46 PMopen class Store<TState, TMessage>(initialState: TState,
val updater: (TState, TMessage, Dispatcher<TMessage>) -> TState)
: Rx.BehaviorSubject<TState>(initialState) {
val messages = Rx.Subject<TMessage>()
val currentState get() = value
val pulse = this.map { Pulse(it, this::dispatch) }
var reporter: Reporter<TState, TMessage> = ConsoleReporter()
init {
messages
.concatMap { message ->
Rx.Observable.of(currentState)
.map {
try {
val newState = updater(it, message, this::dispatch)
reporter.onNewState(message, it, newState)
true to newState
} catch (e: Throwable) {
reporter.onError(message, it, e)
false to currentState
}
}
}
.filter { it.first }
.map { it.second }
.subscribe(this)
}
fun dispatch(message: TMessage) {
messages.next(message)
}
}