TOC
Co-states
Usage
A state machine can be initialized by passing a blueprint of possible states and the corresponding events for the states.
blueprint = [
{
state: 'red',
events: {
go: 'green'
}
}, {
state: 'yellow',
events: {
stop: 'red'
}
}, {
state: 'green',
events: {
warn: 'yellow'
}
}
];
trafficLights = new CoStates(blueprint);
return assert(trafficLights instanceof CoStates);
New instances are automatically initialized with the first state in the blueprint.
var defaultState;
defaultState = blueprint[0].state;
return assert.equal(defaultState, trafficLights.getState());
Functions of the same name as the events in the blueprint are added to the instance.
var eventList, events;
events = [];
eventList = _.pluck(blueprint, 'events');
eventList.forEach(function(set) {
return events = events.concat(Object.keys(set));
});
return events.forEach(function(event) {
return assert(_.isFunction(trafficLights[event]));
});
These functions change the machine state according to the blueprint.
trafficLights.on('state:change', function(current, next) {
callback(assert.equal(next, 'green'));
return trafficLights = new CoStates(blueprint);
});
return trafficLights.go();
State can also be changed by triggering an event on the machine by the same name as the blueprint event.
trafficLights.on('state:change', function(current, next) {
callback(assert.equal(next, 'green'));
return trafficLights = new CoStates(blueprint);
});
return trafficLights.trigger('go');
State machine will throw an error if an invalid event is triggered.
trafficLights.on('error', function(e) {
return callback(assert(e instanceof Error));
});
return trafficLights.stop();
Co-states extends co-events so callbacks for events can be anything that co supports.
trafficLights.on('state:change', function*(__, next) {
return yield function() {
return callback(null);
};
});
return trafficLights.go();