Machina Integration With Monologue v1
by ifandelse
HTML
<script src="http://underscorejs.org/underscore-min.js"></script>
<script src="https://raw.github.com/ifandelse/monologue.js/master/lib/browser/monologue.js"></script>
<script src="https://raw.github.com/ifandelse/machina.js/master/lib/browser/machina.js"></script>
JavaScript
(function(Monologue, machina) {
var slice = Array.prototype.slice;
var payloadMapper = {
handling: function() {
var args = slice.call(arguments, 1);
return {
input: arguments[0],
args: args
};
},
handled: function() {
var args = slice.call(arguments, 1);
return {
input: arguments[0],
args: args
};
},
nohandler: function() {
var args = slice.call(arguments, 1);
return {
input: arguments[0],
args: args
};
},
transition: function(oldState, newState) {
return {
oldState: oldState,
newState: newState
};
},
invalidstate: function(state, invalidState) {
return {
currentState: state,
invalidState: invalidState
};
},
deferred: function(state, queuedArgs) {
var args = slice.call(arguments, 1);
return {
currentState: state,
queuedArgs: queuedArgs
};
}
};
Monologue.makeEmitter(machina.Fsm);
var oldEmit = machina.Fsm.prototype.emit;
machina.Fsm.prototype.emit = function() {
var args = slice.call(arguments, 1);
var topic = arguments[0];
var mapper = this.payloadMapper && this.payloadMapper[topic] ?
this.payloadMapper[topic] :
payloadMapper[topic];
var payload = args;
if (mapper) {
payload = mapper.apply(this, args);
}
oldEmit.call(this, topic, payload);
};
}(Monologue, machina));
var Fsm = machina.Fsm.extend({
states: {
uninitialized: {
start: function() {
this.transition("started");
}
},
...