Skip to content

Instantly share code, notes, and snippets.

@oliveira-marcio
Created January 10, 2020 17:45
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 oliveira-marcio/497a6a53fea852c2d9938c4a9c87a479 to your computer and use it in GitHub Desktop.
Save oliveira-marcio/497a6a53fea852c2d9938c4a9c87a479 to your computer and use it in GitHub Desktop.
State Machine
abstract class StateMachine<T, E>(
private val dispatcher: Dispatcher,
private val errorFactory: ErrorFactory<E>,
protected var currentState: State<T, E> = State(State.Name.IDLE),
private val listeners: MutableList<StateListener<T, E>> = mutableListOf()
) {
abstract fun start()
fun addStateChangedListener(listener: StateListener<T, E>) {
this.listeners.add(listener)
listener.onStateChanged(currentState)
}
fun removeStateChangedListener(listener: StateListener<T, E>) {
this.listeners.remove(listener)
}
fun loadNewState(function: () -> T) {
if (currentState.name == State.Name.LOADING) {
changeAndEmitState(currentState)
return
}
changeAndEmitState(
State(
State.Name.LOADING,
currentState.value
)
)
dispatcher.dispatch(
{
changeAndEmitState(
State(
State.Name.LOADED,
function.invoke()
)
)
},
{ throwable ->
changeAndEmitState(
State(
State.Name.ERROR,
currentState.value,
errorFactory.create(throwable)
)
)
}
)
}
private fun changeAndEmitState(state: State<T, E>) {
currentState = state
for (listener in listeners) {
listener.onStateChanged(currentState)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment