An elegant finite state machine (DFA) written in Kotlin. Base code was in this answer I added strong-typing support and maybe other stuff.
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
Step 2. Add the dependency
dependencies {
compile 'com.github.shakram02:Kt-FSM:v0.0.4'
// implementation 'com.github.shakram02:Kt-FSM:v0.0.4' // For android
}
The following code represents this FSM
Code
import fsm.BaseEvent
import fsm.BaseState
import fsm.StateMachine
// Inherit your custom events and states from provided base classes
class GoUp : BaseEvent()
class Initial : BaseState()
class Repeat : BaseState()
fun main(args: Array<String>) {
val m = StateMachine.buildStateMachine(Initial()) {
state(Initial()) {
// Code written outside action{} will run as Kotlin's init{}
println("Initializing")
// Code on state processing
action {
println("Entered [${it.name.javaClass.simpleName}]")
}
edge(GoUp(), Repeat()) {
// Code of transition
action {
println("Going to Repeat state")
}
}
}
state(Repeat()) {
action {
println("Entered [${it.name.javaClass.simpleName}]")
}
// Multiple actions
action {
println("Will get bored!")
}
edge(GoUp(), Repeat()) {
action {
println("Repeating")
}
}
}
}
m.initialize()
m.acceptEvent(GoUp())
m.acceptEvent(GoUp())
m.acceptEvent(GoUp())
}
Output
Initializing
Entered [Initial]
Going to Repeat state
Entered [Repeat]
Will get bored!
Repeating
Entered [Repeat]
Will get bored!
Repeating
Entered [Repeat]
Will get bored!