Use StateMachine in Kotlin
mainTo use StateMachine in Kotlin, define your State, Event, and SideEffect as sealed classes. Use the StateMachine.create<State, Event, SideEffect> DSL to initialize the machine, define the initialState, declare state-specific transitions using state<T> { on<E> { ... } }, and handle side effects via onTransition.
Transitions are performed using stateMachine.transition(event) which returns a StateMachine.Transition.Valid object if the transition is successful.
// 1. Define types
sealed class State {
object Solid : State()
object Liquid : State()
}
sealed class Event {
object OnMelted : Event()
}
sealed class SideEffect {
object LogMelted : SideEffect()
}
// 2. Initialize
val stateMachine = StateMachine.create<State, Event, SideEffect> {
initialState(State.Solid)
state<State.Solid> {
on<Event.OnMelted> {
transitionTo(State.Liquid, SideEffect.LogMelted)
}
}
onTransition {
val validTransition = it as? StateMachine.Transition.Valid ?: return@onTransition
when (validTransition.sideEffect) {
SideEffect.LogMelted -> logger.log("Melted")
}
}
}
// 3. Perform transition
val transition = stateMachine.transition(Event.OnMelted)