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"}
  ]
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