diff --git a/dist/counter.mjs b/dist/counter.mjs new file mode 100644 index 00000000..f332e6c5 --- /dev/null +++ b/dist/counter.mjs @@ -0,0 +1,9 @@ +export class Counter { + _lHWM = 0; + constructor(pStart = 0) { + this._lHWM = pStart; + } + next() { + return ++this._lHWM; + } +} diff --git a/dist/state-machine-model.mjs b/dist/state-machine-model.mjs index fbe70549..ff1d3d4c 100644 --- a/dist/state-machine-model.mjs +++ b/dist/state-machine-model.mjs @@ -68,6 +68,9 @@ export default class StateMachineModel { (pTransition) => pTransition.to === pToStateName, ); } + getMaximumTransitionId() { + return Math.max(...this._flattenedTransitions.map(({ id }) => id)); + } findTransitionsToSiblings(pStateName, pExcludeIds) { return this._flattenedTransitions.filter( (pTransition) => diff --git a/dist/transform/desugar.mjs b/dist/transform/desugar.mjs index fad0c346..cc866306 100644 --- a/dist/transform/desugar.mjs +++ b/dist/transform/desugar.mjs @@ -1,16 +1,22 @@ import StateMachineModel from "../state-machine-model.mjs"; +import { Counter } from "../counter.mjs"; import utl from "./utl.mjs"; function fuseTransitionAttribute(pIncomingThing, pOutgoingThing, pJoinChar) { return pIncomingThing ? `${pIncomingThing}${pJoinChar}${pOutgoingThing}` : pOutgoingThing; } -function fuseIncomingToOutgoing(pIncomingTransition, pOutgoingTransition) { +function fuseIncomingToOutgoing( + pIncomingTransition, + pOutgoingTransition, + pCounter, +) { const lReturnValue = { ...pIncomingTransition, ...pOutgoingTransition, from: pIncomingTransition.from, to: pOutgoingTransition.to, + id: pCounter.next(), }; if (pOutgoingTransition.action) { lReturnValue.action = fuseTransitionAttribute( @@ -32,13 +38,14 @@ function fuseTransitions( pTransitions, pPseudoStateNames, pOutgoingTransitionMap, + pCounter, ) { return pTransitions.reduce((pAll, pTransition) => { pPseudoStateNames.forEach((pStateName, pIndex) => { if (pStateName === pTransition.to && pOutgoingTransitionMap[pStateName]) { pAll = pAll.concat( pOutgoingTransitionMap[pStateName].map((pOutgoingTransition) => - fuseIncomingToOutgoing(pTransition, pOutgoingTransition), + fuseIncomingToOutgoing(pTransition, pOutgoingTransition, pCounter), ), ); } else { @@ -52,6 +59,7 @@ function deSugarPseudoStates( pMachine, pPseudoStateNames, pOutgoingTransitionMap, + pCounter, ) { const lMachine = structuredClone(pMachine); if (lMachine.transitions && pPseudoStateNames.length > 0) { @@ -59,6 +67,7 @@ function deSugarPseudoStates( lMachine.transitions, pPseudoStateNames, pOutgoingTransitionMap, + pCounter, ); } lMachine.states = lMachine.states.map((pState) => @@ -69,6 +78,7 @@ function deSugarPseudoStates( pState.statemachine, pPseudoStateNames, pOutgoingTransitionMap, + pCounter, ), } : pState, @@ -117,10 +127,12 @@ export default ( }, {}, ); + const lMaximumTransitionId = lModel.getMaximumTransitionId(); const lMachine = deSugarPseudoStates( pMachine, lPseudoStateNames, lOutgoingTransitionMap, + new Counter(lMaximumTransitionId), ); return removeStatesCascading(lMachine, lPseudoStateNames); }; diff --git a/docs/index.html b/docs/index.html index a57a91ef..a18ed13d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -35,7 +35,7 @@ - + diff --git a/docs/inpage.html b/docs/inpage.html index 3e802e87..4edd7db2 100644 --- a/docs/inpage.html +++ b/docs/inpage.html @@ -23,7 +23,7 @@ src="state-machine-cat-inpage.min.js" type="module" defer - integrity="sha512-9CN180iJ3HTh9OG66+9sLwGvlbPCqSa+CMKzViJ3nm1FV/KvFEOfbHQQvwePPFsGWoqRnXTdZbvv2djiTq389Q==" + integrity="sha512-12WmjzUUso9QyOVws/FxWSeM8JEabqFWu2j2xB2193mYrjPnFHDLpJc54Y/4UHSjGkewBlOnl3BblJNeNdMtzA==" >