Maxine (Maxine v1.1.1)
Functions for dealing with machines: to wit, generate/2, which
creates an initial %State{} struct from a %Machine{}, and
advance/3 (along with companion advance!/3) which transforms
one %State{} into another one according to the rules given in
the machine.
Link to this section Summary
Link to this section Functions
Link to this function
advance(current, event, options \\ [])
Specs
advance(
current :: %Maxine.State{
data: term(),
machine: term(),
name: term(),
previous: term()
},
event :: Maxine.Machine.event_name(),
options :: Maxine.Machine.event_options()
) ::
{:ok,
%Maxine.State{data: term(), machine: term(), name: term(), previous: term()}}
| {:error, Maxine.Errors.error()}
Creates a new state record based on the current state, an event, and options (optionally).
Parameters
- current: A
%State{}record; the current state - event: The name of the event you'd like to call (atom)
- options: optional arguments to the event; will be preserved in state.data.options
Examples
iex> alias Maxine.Examples.Package
iex> state = Maxine.generate(Package.machine)
iex> {:ok, state = %Maxine.State{}} = Maxine.advance(state, :ship)
iex> state.name
:in_transit
iex> alias Maxine.Examples.Package
iex> state = Maxine.generate(Package.machine)
iex> {:ok, state = %Maxine.State{}} = Maxine.advance(state, :ship, foo: "bar")
iex> state.data.options[:foo]
"bar"
Link to this function
advance!(current, event, options \\ [])
Specs
advance!(
current :: %Maxine.State{
data: term(),
machine: term(),
name: term(),
previous: term()
},
event :: Maxine.Machine.event_name(),
options :: Maxine.Machine.event_options()
) ::
%Maxine.State{data: term(), machine: term(), name: term(), previous: term()}
| no_return()
Exception-raising wrapper (unwrapper?) for the advance/3.
Parameters
- current: A
%State{}record; the current state - event: The name of the event you'd like to call (atom)
- options: optional arguments to the event; will be preserved
Examples
iex> alias Maxine.Examples.Package
iex> state = Maxine.generate(Package.machine)
iex> state = Maxine.advance!(state, :ship)
iex> state.name
:in_transit
Link to this function
generate(machine, initial \\ nil)
Specs
generate(
machine :: %Maxine.Machine{
callbacks: term(),
groups: term(),
initial: term(),
transitions: term()
},
initial :: Maxine.Machine.state_name()
) :: %Maxine.State{
data: term(),
machine: term(),
name: term(),
previous: term()
}
Create a new state machine, optionally specifying a starting state other than the one given in the machine.
Parameters
- machine: An instance of
%Machine{}that specifies events, transitions, states, callbacks - initial: An optional initial state, overriding the machine's default
Examples
iex> alias Maxine.Examples.Package
iex> Maxine.generate(Package.machine).name
:origin
iex> alias Maxine.Examples.Package
iex> Maxine.generate(Package.machine, :foobar).name
:foobar