UNPKG

statemachinejs

Version:

Implementation of State Machine Pattern in JavaScript.

8 lines (7 loc) 3.56 kB
(function(p){var J=p.StateMachine,b={__version__:"0.1.1",__license__:"MIT",__author__:"Ye Liu",__contact__:"yeliu@instast.com",__copyright__:"Copyright (c) 2013 Ye Liu",noConflict:function(){p.StateMachine=J;return this},init:function(b,g,h,a){var c;switch(arguments.length){case 0:b={};g=[];break;case 1:b=b||{};case 2:g=f(g||b.states)}c=w(b,g);c.callEntryIfTransitBack=r(h)?h:!0;c.callExitIfTransitBack=r(a)?a:!0;b.fsm=c;b.handleStateTrigger=x(c);b.getCurrentStateName=function(){return c.currentState? c.currentState.name:null};b.getPreviousStateName=function(){return c.previousState?c.previousState.name:null};0<g.length&&(c.currentState=s(c,g[0].name),t(c));return b}},w=function(b,g){var h={host:b,statesMap:{},currentState:null,currentStateStack:[]};g=f(g);for(var a=0,c=g.length;a<c;a++)y(h.statesMap,g[a]);return h},y=function g(b,a,c){m(a)?a={name:a}:a||(a={});m(a.name)||(a.name="UnnamedState");var d={name:a.name,fqn:a.name,entry:a.entry,exit:a.exit,transitions:[],outerState:null,innerStates:[]}; c&&(d.fqn=c.fqn+"."+d.name,d.outerState=c);b[d.fqn]=d;a.transitions=f(a.transitions);for(var e=0,l=a.transitions.length;e<l;e++)c=a.transitions[e],d.transitions[e]={trigger:c.trigger,dest:c.dest,action:c.action,guard:c.guard};a.innerStates=f(a.innerStates);e=0;for(l=a.innerStates.length;e<l;e++)d.innerStates[e]=g(b,a.innerStates[e],d);return d},x=function(b){var h=b.host;return function(a,c,d){var e=b.currentState;a=z(e,a);for(var l,f,k=0,m=a.length;k<m;k++)if(l=a[k],!1!==n(l.guard,h,d)&&(f=s(b,l.dest))){n(l.action, h,c);(f!==e&&f.outerState!==e||f===e&&b.callExitIfTransitBack)&&A(b,e,f);(function K(a,c){B(b,a,c);(c!==a||b.callEntryIfTransitBack)&&t(b);0<c.innerStates.length&&K(c,c.innerStates[0])})(e,f);break}}},z=function(b,h){var a=[],c;if(b)for(var d=0,e=b.transitions.length;d<e;d++)c=b.transitions[d],c.trigger===h&&a.push(c);return a},s=function h(a,b){var d,e=a.currentState?a.currentState.outerState:null;e?(d=a.statesMap[e.fqn+"."+b],d||(C(a,e),d=h(a,b),D(a))):d=a.statesMap[b];return d},C=function(b,a){b.currentStateStack.push(b.currentState); b.currentState=a},D=function(b){b.currentState=b.currentStateStack.pop()},B=function(b,a,c){b.previousState=a;b.currentState=c},t=function(b){var a=b.host;if(b=b.currentState)n(b.entry,a),a.handleStateTrigger(".")},A=function a(b,d,e){var f=d.outerState;n(d.exit,b.host);f&&(f!==e&&f!==e.outerState)&&a(b,d.outerState,e)},u=function(a){return void 0!==a&&null!==a&&"[object Object]"===k.call(a)},q=function(a){return"[object Function]"===k.call(a)},m=function(a){return"[object String]"===k.call(a)},E= function(a){return"[object Number]"===k.call(a)},r=function(a){return"[object Boolean]"===k.call(a)},F=Array.isArray||function(a){return"[object Array]"===k.call(a)},G=function(a){return E(a.length)&&!u(a)&&!m(a)&&!q(a)},f=function(a){return void 0===a||null===a?[]:F(a)?a:G(a)?Array.prototype.slice.call(a,0):[a]},I=function(a,b){return q(a)?a:m(a)&&u(b)&&q(b[a])?b[a]:H},n=function(a,b,d){return I(a,b).apply(b,f(d))},k=Object.prototype.toString,H=function(){};p.STATEMACHINE_EXPORT_EXTRA&&(b.isObject= u,b.isFunction=q,b.isString=m,b.isNumber=E,b.isBoolean=r,b.isArray=F,b.isArrayLike=G,b.arrayFrom=f,b.functionFrom=I,b.functionApply=n,b.nop=H,b.initFsm=w,b.initState=y,b.handleStateTriggerFactory=x,b.getTransitions=z,b.getState=s,b.pushCurrentState=C,b.popCurrentState=D,b.changeState=B,b.doEntryAction=t,b.doExitAction=A);if("undefined"!==typeof module)for(var v in b)b.hasOwnProperty(v)&&(exports[v]=b[v]);else"undefined"!==typeof define?define(b):p.StateMachine=b})(this);