Simple Elixir library to define composable mealy
FSM as function
(not related at all with :gen_fsm, no state/process management).
defmodule Light do
use ExFSM
deftrans on({:off, _}, state), do: {:next_state, :off, state}
deftrans off({:on, _}, state), do: {:next_state, :on, state}
end
defmodule Light.State do
@enforced_keys [:state]
defstruct @enforced_keys
end
defimpl ExFSM.Machine.State, for: Light.State do
def state_name(state), do: state.state
def set_state_name(state, state_name), do: struct(state, state: state_name)
def handlers(_state), do: [Light]
end
{:next_state, %_{state: :off} = state} = ExFSM.Machine.event({:on, nil}, %Light{state: :off})
{:next_state, %_{state: :on} = state} = ExFSM.Machine.event({:off, nil}, %Light{state: :on})
{:error, :illegal_action} = ExFSM.Machine.event({:on, nil}, %Light{state: :on})- define an FSM with handler modules defining each transition as a simple function but using a
macro
deftranswhich creates a functionfsmreturning the fsm transition map for this handler module. deftranshas the same semantic as erlang in memory FSM gen_fsm- combine together multiple FSM handlers to create a "meta" FSM.
- send event with the function
eventwhich simply find the right handler, execute the handler function.
See in in code documentation
Hi, and thank you for wanting to contribute. Please refer to the centralized informations available at: https://github.com/kbrw\#contributing