A state machine can be initialized by passing a blueprint of possible states and the corresponding events for the states.
/* A simple traffic light as a state machine implementation. */blueprint =state: 'red'events:go: 'green'state: 'yellow'events:stop: 'red'state: 'green'events:warn: 'yellow';trafficLights = blueprint;return ;
New instances are automatically initialized with the first state in the blueprint.
var defaultState;defaultState = blueprint0state;return assert;
Functions of the same name as the events in the blueprint are added to the instance.
/* Get event list from blueprint. */var eventList events;events = ;eventList = _;eventList;/* Check that functions are present. */return events;
These functions change the machine state according to the blueprint.
/*A 'state:change' event is triggered on the statemachine when state is changed. The current stateand the next state are passed as extra parameters.*/trafficLights;/* Trigger state change. */return trafficLights;
State can also be changed by triggering an event on the machine by the same name as the blueprint event.
trafficLights;/* Trigger state change. */return trafficLights;
State machine will throw an error if an invalid event is triggered.
/*An 'error' event is triggered when an invalid stateevent is attempted. An <Error> object is passedalong with a helpful message.*/trafficLights;/* Trigger invalid event 'stop' for state 'red'. */return trafficLights;
Co-states extends co-events so callbacks for events can be anything that co supports.
/* Generators FTW! */trafficLights;return trafficLights;