50 lines
1.2 KiB
Kotlin
50 lines
1.2 KiB
Kotlin
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
package org.mozilla.fenix.mvi
|
|
|
|
import io.reactivex.ObservableTransformer
|
|
import io.reactivex.subjects.Subject
|
|
import mozilla.components.support.base.log.logger.Logger
|
|
|
|
/**
|
|
* An action is a command or intent the user performed
|
|
*/
|
|
interface Action
|
|
|
|
/**
|
|
* A Change is a change to the view coming from the model
|
|
* (Extending action so we can reuse the ActionBusFactory)
|
|
*/
|
|
interface Change : Action
|
|
|
|
/**
|
|
* A ViewState is a model reflecting the current state of the view
|
|
*/
|
|
interface ViewState
|
|
|
|
/**
|
|
* A Reducer applies changes to the ViewState
|
|
*/
|
|
typealias Reducer<S, C> = (S, C) -> S
|
|
|
|
/**
|
|
* Simple logger for tracking ViewState changes
|
|
*/
|
|
fun <S> logState(): ObservableTransformer<S, S> = ObservableTransformer { observable ->
|
|
observable.doOnNext {
|
|
if (BuildConfig.DEBUG) Logger("State").debug(it.toString())
|
|
}
|
|
}
|
|
|
|
/**
|
|
* For capturing state to a Subject for testing
|
|
*/
|
|
fun <S> captureState(subject: Subject<S>):
|
|
ObservableTransformer<S, S> = ObservableTransformer { observable ->
|
|
observable.doOnNext {
|
|
subject.onNext(it)
|
|
}
|
|
}
|