Elixir Finite state machine
This package is inspired by ecto_fsm package
This package allows to use finite state machine pattern in elixir.
I have rewritten this library to make code simple and easier to use Install
def deps do
[
{:as_fsm, "~> 1.0.0"}
]
end
1. Usage
Define your FSM
defmodule TestFsm do
use AsFsm
def_event(:start, from: :idle, to: :running, name: "Start event", when: :check_it)
def_event(:pause, from: :running, to: :paused, name: "Pause", when: :check_it)
def_event(:stop, from: [:running, :paused], to: :idle, name: "Stop", when: :check_it)
def check_it(object, params) do
:ok
end
def on_start(object, params) do
IO.inspect(object)
IO.inspect(params)
{:ok, object}
end
end
list all state
#> OrderState.states()
#> [:new, :processing, :cancelled, :delivered]
list all event
#> OrderState.events()
#> [{:confirm, "Confirm"}, {:deliver, "Deliver"}, {:cancel, "Cancel Order"}]
Check if can accept event
#> model = %{state: :new}
#> OrderState.can?(:confirm, model)
#> true
#> OrderState.can?(:cancel, model)
#> true
#> OrderState.can?(:deliver, model)
#> false
Get accepted events All events that can used to trigger a transition
#> model = %{state: :new}
#> OrderState.available_events(model)
#> [{:confirm, "Confirm"}, {:cancel, "Cancel order"}]
Trigger an event
#> model = %{state: :new}
#> OrderState.trigger(:confirm, model)
#> %{state: :processing}
#> # you can even pass data when trigger event
#> OrderState.trigger(:confirm, model, %{message: "oke man"})
Options
- Custom property name by default property name is :state
defmodule ExampleFsm do
use AsFsm,
column: :status,
end