A simple Julia implementation of finite state machines.
Julia
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src
test
.gitignore
.travis.yml
LICENSE
README.md
REQUIRE

README.md

FiniteStateMachine

Build Status Coverage Status FiniteStateMachine FiniteStateMachine

A simple finite state machine library for Julia, based on Jake Gordon's javascript-state-machine.

Installation

julia> Pkg.add("FiniteStateMachine")

Usage

StateMachine objects are set up using the state_machine function, which takes a "model" describing your state machine's layout as input.

julia> using FiniteStateMachine

julia> fsm = state_machine({
    "initial" => "first",
    "final" => "fourth",
    "events" => [{
            "name" => "hop",
            "from" => "first",
            "to" => "second",
        }, {
            "name" => "skip",
            "from" => "second",
            "to" => "third",
        }, {
            "name" => "jump",
            "from" => "third",
            "to" => "fourth",
        },
    ],
    "callbacks" => {
        "onbeforeevent" => (fsm::StateMachine, args...) -> 1+1,
    },
})

Events are called using the fire function:

julia> fsm.current
"first"

julia> fire(fsm, "hop")

julia> fsm.current
"second"

julia> fire(fsm, "skip")

julia> fsm.current
"third"

julia> fire(fsm, "jump")

julia> fsm.current
"fourth"

julia> fire(fsm, "finished")
true

Unless other specified, a special "startup" event fires automatically when the state machine is created.

The "initial" field can be either a string, or a dict specifying: state (the name of the state in which to start), event (the startup event), and/or defer (set to true if the startup event should not be fired automatically when the state machine is created).

Supports multiple source states, for example, the following code allows "hop" to take place from either the "first" or "third" states:

"events" => [{
    "name" => "hop",
    "from" => ["first", "third"],
    "to" => "second",
},

Tests

Unit tests are located in test/. To run the tests:

$ julia test/runtests.jl