From 5a2864b849fbd1d7441a7926faa76f9fd27e7f72 Mon Sep 17 00:00:00 2001 From: jgithub Date: Fri, 24 Feb 2017 15:23:53 -0600 Subject: [PATCH] sameStateTransitions --- state-machine.js | 3 ++- state-machine.min.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/state-machine.js b/state-machine.js index e917a2a..52a565e 100755 --- a/state-machine.js +++ b/state-machine.js @@ -83,6 +83,7 @@ fsm.transitions = function() { return (transitions[this.current] || []).concat(transitions[StateMachine.WILDCARD] || []); }; fsm.isFinished = function() { return this.is(terminal); }; fsm.error = cfg.error || function(name, from, to, args, error, msg, e) { throw e || msg; }; // default behavior when something unexpected happens is to throw an exception, but caller can override this behavior if desired (see github issue #3 and #17) + fsm.sameStateTransitions = !!cfg.sameStateTransitions; fsm.states = function() { return Object.keys(transitions).sort() }; if (initial && !initial.defer) @@ -159,7 +160,7 @@ if (false === StateMachine.beforeEvent(this, name, from, to, args)) return StateMachine.Result.CANCELLED; - if (from === to) { + if (from === to && !this.sameStateTransitions) { StateMachine.afterEvent(this, name, from, to, args); return StateMachine.Result.NOTRANSITION; } diff --git a/state-machine.min.js b/state-machine.min.js index 9093160..f7ac4dc 100644 --- a/state-machine.min.js +++ b/state-machine.min.js @@ -1 +1 @@ -!function(){var t={VERSION:"2.4.0",Result:{SUCCEEDED:1,NOTRANSITION:2,CANCELLED:3,PENDING:4},Error:{INVALID_TRANSITION:100,PENDING_TRANSITION:200,INVALID_CALLBACK:300},WILDCARD:"*",ASYNC:"async",create:function(e,n){var r="string"==typeof e.initial?{state:e.initial}:e.initial,i=e.terminal||e.final,a=n||e.target||{},o=e.events||[],u=e.callbacks||{},s={},c={},f=function(e){var n=Array.isArray(e.from)?e.from:e.from?[e.from]:[t.WILDCARD];s[e.name]=s[e.name]||{};for(var r=0;r=0:this.current===t},a.can=function(e){return!this.transition&&void 0!==s[e]&&(s[e].hasOwnProperty(this.current)||s[e].hasOwnProperty(t.WILDCARD))},a.cannot=function(t){return!this.can(t)},a.transitions=function(){return(c[this.current]||[]).concat(c[t.WILDCARD]||[])},a.isFinished=function(){return this.is(i)},a.error=e.error||function(t,e,n,r,i,a,o){throw o||a},a.states=function(){return Object.keys(c).sort()},r&&!r.defer&&a[r.event](),a},doCallback:function(e,n,r,i,a,o){if(n)try{return n.apply(e,[r,i,a].concat(o))}catch(n){return e.error(r,i,a,o,t.Error.INVALID_CALLBACK,"an exception occurred in a caller-provided callback function",n)}},beforeAnyEvent:function(e,n,r,i,a){return t.doCallback(e,e.onbeforeevent,n,r,i,a)},afterAnyEvent:function(e,n,r,i,a){return t.doCallback(e,e.onafterevent||e.onevent,n,r,i,a)},leaveAnyState:function(e,n,r,i,a){return t.doCallback(e,e.onleavestate,n,r,i,a)},enterAnyState:function(e,n,r,i,a){return t.doCallback(e,e.onenterstate||e.onstate,n,r,i,a)},changeState:function(e,n,r,i,a){return t.doCallback(e,e.onchangestate,n,r,i,a)},beforeThisEvent:function(e,n,r,i,a){return t.doCallback(e,e["onbefore"+n],n,r,i,a)},afterThisEvent:function(e,n,r,i,a){return t.doCallback(e,e["onafter"+n]||e["on"+n],n,r,i,a)},leaveThisState:function(e,n,r,i,a){return t.doCallback(e,e["onleave"+r],n,r,i,a)},enterThisState:function(e,n,r,i,a){return t.doCallback(e,e["onenter"+i]||e["on"+i],n,r,i,a)},beforeEvent:function(e,n,r,i,a){if(!1===t.beforeThisEvent(e,n,r,i,a)||!1===t.beforeAnyEvent(e,n,r,i,a))return!1},afterEvent:function(e,n,r,i,a){t.afterThisEvent(e,n,r,i,a),t.afterAnyEvent(e,n,r,i,a)},leaveState:function(e,n,r,i,a){var o=t.leaveThisState(e,n,r,i,a),u=t.leaveAnyState(e,n,r,i,a);return!1!==o&&!1!==u&&(t.ASYNC===o||t.ASYNC===u?t.ASYNC:void 0)},enterState:function(e,n,r,i,a){t.enterThisState(e,n,r,i,a),t.enterAnyState(e,n,r,i,a)},buildEvent:function(e,n){return function(){var r=this.current,i=n[r]||(n[t.WILDCARD]!=t.WILDCARD?n[t.WILDCARD]:r)||r,a=Array.prototype.slice.call(arguments);if(this.transition)return this.error(e,r,i,a,t.Error.PENDING_TRANSITION,"event "+e+" inappropriate because previous transition did not complete");if(this.cannot(e))return this.error(e,r,i,a,t.Error.INVALID_TRANSITION,"event "+e+" inappropriate in current state "+this.current);if(!1===t.beforeEvent(this,e,r,i,a))return t.Result.CANCELLED;if(r===i)return t.afterEvent(this,e,r,i,a),t.Result.NOTRANSITION;var o=this;this.transition=function(){return o.transition=null,o.current=i,t.enterState(o,e,r,i,a),t.changeState(o,e,r,i,a),t.afterEvent(o,e,r,i,a),t.Result.SUCCEEDED},this.transition.cancel=function(){o.transition=null,t.afterEvent(o,e,r,i,a)};var u=t.leaveState(this,e,r,i,a);return!1===u?(this.transition=null,t.Result.CANCELLED):t.ASYNC===u?t.Result.PENDING:this.transition?this.transition():void 0}}};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=t),exports.StateMachine=t):"function"==typeof define&&define.amd?define(function(e){return t}):"undefined"!=typeof window?window.StateMachine=t:"undefined"!=typeof self&&(self.StateMachine=t)}(); \ No newline at end of file +!function(){var t={VERSION:"2.4.0",Result:{SUCCEEDED:1,NOTRANSITION:2,CANCELLED:3,PENDING:4},Error:{INVALID_TRANSITION:100,PENDING_TRANSITION:200,INVALID_CALLBACK:300},WILDCARD:"*",ASYNC:"async",create:function(e,n){var r="string"==typeof e.initial?{state:e.initial}:e.initial,a=e.terminal||e.final,i=n||e.target||{},o=e.events||[],s=e.callbacks||{},u={},c={},f=function(e){var n=Array.isArray(e.from)?e.from:e.from?[e.from]:[t.WILDCARD];u[e.name]=u[e.name]||{};for(var r=0;r=0:this.current===t},i.can=function(e){return!this.transition&&void 0!==u[e]&&(u[e].hasOwnProperty(this.current)||u[e].hasOwnProperty(t.WILDCARD))},i.cannot=function(t){return!this.can(t)},i.transitions=function(){return(c[this.current]||[]).concat(c[t.WILDCARD]||[])},i.isFinished=function(){return this.is(a)},i.error=e.error||function(t,e,n,r,a,i,o){throw o||i},i.sameStateTransitions=!!e.sameStateTransitions,i.states=function(){return Object.keys(c).sort()},r&&!r.defer&&i[r.event](),i},doCallback:function(e,n,r,a,i,o){if(n)try{return n.apply(e,[r,a,i].concat(o))}catch(n){return e.error(r,a,i,o,t.Error.INVALID_CALLBACK,"an exception occurred in a caller-provided callback function",n)}},beforeAnyEvent:function(e,n,r,a,i){return t.doCallback(e,e.onbeforeevent,n,r,a,i)},afterAnyEvent:function(e,n,r,a,i){return t.doCallback(e,e.onafterevent||e.onevent,n,r,a,i)},leaveAnyState:function(e,n,r,a,i){return t.doCallback(e,e.onleavestate,n,r,a,i)},enterAnyState:function(e,n,r,a,i){return t.doCallback(e,e.onenterstate||e.onstate,n,r,a,i)},changeState:function(e,n,r,a,i){return t.doCallback(e,e.onchangestate,n,r,a,i)},beforeThisEvent:function(e,n,r,a,i){return t.doCallback(e,e["onbefore"+n],n,r,a,i)},afterThisEvent:function(e,n,r,a,i){return t.doCallback(e,e["onafter"+n]||e["on"+n],n,r,a,i)},leaveThisState:function(e,n,r,a,i){return t.doCallback(e,e["onleave"+r],n,r,a,i)},enterThisState:function(e,n,r,a,i){return t.doCallback(e,e["onenter"+a]||e["on"+a],n,r,a,i)},beforeEvent:function(e,n,r,a,i){if(!1===t.beforeThisEvent(e,n,r,a,i)||!1===t.beforeAnyEvent(e,n,r,a,i))return!1},afterEvent:function(e,n,r,a,i){t.afterThisEvent(e,n,r,a,i),t.afterAnyEvent(e,n,r,a,i)},leaveState:function(e,n,r,a,i){var o=t.leaveThisState(e,n,r,a,i),s=t.leaveAnyState(e,n,r,a,i);return!1!==o&&!1!==s&&(t.ASYNC===o||t.ASYNC===s?t.ASYNC:void 0)},enterState:function(e,n,r,a,i){t.enterThisState(e,n,r,a,i),t.enterAnyState(e,n,r,a,i)},buildEvent:function(e,n){return function(){var r=this.current,a=n[r]||(n[t.WILDCARD]!=t.WILDCARD?n[t.WILDCARD]:r)||r,i=Array.prototype.slice.call(arguments);if(this.transition)return this.error(e,r,a,i,t.Error.PENDING_TRANSITION,"event "+e+" inappropriate because previous transition did not complete");if(this.cannot(e))return this.error(e,r,a,i,t.Error.INVALID_TRANSITION,"event "+e+" inappropriate in current state "+this.current);if(!1===t.beforeEvent(this,e,r,a,i))return t.Result.CANCELLED;if(r===a&&!this.sameStateTransitions)return t.afterEvent(this,e,r,a,i),t.Result.NOTRANSITION;var o=this;this.transition=function(){return o.transition=null,o.current=a,t.enterState(o,e,r,a,i),t.changeState(o,e,r,a,i),t.afterEvent(o,e,r,a,i),t.Result.SUCCEEDED},this.transition.cancel=function(){o.transition=null,t.afterEvent(o,e,r,a,i)};var s=t.leaveState(this,e,r,a,i);return!1===s?(this.transition=null,t.Result.CANCELLED):t.ASYNC===s?t.Result.PENDING:this.transition?this.transition():void 0}}};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=t),exports.StateMachine=t):"function"==typeof define&&define.amd?define(function(e){return t}):"undefined"!=typeof window?window.StateMachine=t:"undefined"!=typeof self&&(self.StateMachine=t)}(); \ No newline at end of file