@@ -193,99 +193,98 @@ export function statechart<C extends IConfiguration, S extends string>(
193193 filter ( function canTransition ( _ , { transition } ) {
194194 return Boolean ( transition )
195195 } ) ,
196- parallel (
197- mutate ( function runAction ( context : any , { transition, payload } ) {
198- if ( transition === 'entry' || transition === 'exit' ) {
199- return actions [ key ] ( context , payload )
200- }
201-
196+ mutate ( function runAction ( context : any , { transition, payload } ) {
197+ if ( transition === 'entry' || transition === 'exit' ) {
202198 return actions [ key ] ( context , payload )
203- } ) ,
204- mutate ( function performTransition ( context : any ) {
205- const stateTarget = getTarget (
206- context . state ,
207- context . execution . namespacePath
208- )
209- const resolvedActions = getTarget (
210- context . actions ,
211- context . execution . namespacePath
212- )
213- const oldStatePath = stateTarget . state . slice ( )
214- const currentStatePath = stateTarget . state . slice ( )
215- const stateTransitions = currentStatePath . map ( ( ) => null )
216-
217- // Build new transition path
218- while ( currentStatePath . length ) {
219- const target = getStateTarget ( chart , currentStatePath )
220-
221- // Collect the new transition state
222- if ( target . on && target . on [ key ] ) {
223- stateTransitions [ currentStatePath . length - 1 ] =
224- target . on [ key ] . target || target . on [ key ]
225- }
226-
227- currentStatePath . pop ( )
228- }
199+ }
229200
230- const newStatePath = createNewStatePath (
231- stateTarget . state ,
232- stateTransitions ,
233- chart
234- )
235-
236- // Go down old path and trigger exits where the state has changed
237- const traverseOldPath = oldStatePath . slice ( )
238- while ( traverseOldPath . length ) {
239- const target = getStateTarget ( chart , traverseOldPath )
240-
241- if (
242- target . exit &&
243- newStatePath [ traverseOldPath . length - 1 ] !==
244- oldStatePath [ traverseOldPath . length - 1 ]
245- ) {
246- resolvedActions [ target . exit ] ( )
247- }
248-
249- traverseOldPath . pop ( )
201+ const result = actions [ key ] ( context , payload )
202+
203+ const stateTarget = getTarget (
204+ context . state ,
205+ context . execution . namespacePath
206+ )
207+ const resolvedActions = getTarget (
208+ context . actions ,
209+ context . execution . namespacePath
210+ )
211+ const oldStatePath = stateTarget . state . slice ( )
212+ const currentStatePath = stateTarget . state . slice ( )
213+ const stateTransitions = currentStatePath . map ( ( ) => null )
214+
215+ // Build new transition path
216+ while ( currentStatePath . length ) {
217+ const target = getStateTarget ( chart , currentStatePath )
218+
219+ // Collect the new transition state
220+ if ( target . on && target . on [ key ] ) {
221+ stateTransitions [ currentStatePath . length - 1 ] =
222+ target . on [ key ] . target || target . on [ key ]
250223 }
251224
252- if ( newStatePath . join ( ) !== oldStatePath . join ( ) ) {
253- stateTarget . state = newStatePath . slice ( )
225+ currentStatePath . pop ( )
226+ }
227+
228+ const newStatePath = createNewStatePath (
229+ stateTarget . state ,
230+ stateTransitions ,
231+ chart
232+ )
233+
234+ // Go down old path and trigger exits where the state has changed
235+ const traverseOldPath = oldStatePath . slice ( )
236+ while ( traverseOldPath . length ) {
237+ const target = getStateTarget ( chart , traverseOldPath )
238+
239+ if (
240+ target . exit &&
241+ newStatePath [ traverseOldPath . length - 1 ] !==
242+ oldStatePath [ traverseOldPath . length - 1 ]
243+ ) {
244+ resolvedActions [ target . exit ] ( )
254245 }
255246
256- // Go down new path and trigger any entry on new states
257- const traverseNewPath = newStatePath . slice ( )
258- while ( traverseNewPath . length ) {
259- const target = getStateTarget ( chart , traverseNewPath )
247+ traverseOldPath . pop ( )
248+ }
260249
261- if (
262- target . entry &&
263- newStatePath [ traverseNewPath . length - 1 ] !==
264- oldStatePath [ traverseNewPath . length - 1 ]
265- ) {
266- resolvedActions [ target . entry ] ( )
267- }
250+ if ( newStatePath . join ( ) !== oldStatePath . join ( ) ) {
251+ stateTarget . state = newStatePath . slice ( )
252+ }
268253
269- traverseNewPath . pop ( )
254+ // Go down new path and trigger any entry on new states
255+ const traverseNewPath = newStatePath . slice ( )
256+ while ( traverseNewPath . length ) {
257+ const target = getStateTarget ( chart , traverseNewPath )
258+
259+ if (
260+ target . entry &&
261+ newStatePath [ traverseNewPath . length - 1 ] !==
262+ oldStatePath [ traverseNewPath . length - 1 ]
263+ ) {
264+ resolvedActions [ target . entry ] ( )
270265 }
271266
272- if ( process . env . NODE_ENV === 'development' ) {
273- currentInstance . devtools . send ( {
274- type : 'chart' ,
275- data : {
276- path : context . execution . namespacePath ,
277- state : stateTarget . state ,
278- chart : chart ,
279- actions : getCanTransitionActions (
280- config . actions ,
281- chart ,
282- stateTarget
283- ) ,
284- } ,
285- } )
286- }
287- } )
288- )
267+ traverseNewPath . pop ( )
268+ }
269+
270+ if ( process . env . NODE_ENV === 'development' ) {
271+ currentInstance . devtools . send ( {
272+ type : 'chart' ,
273+ data : {
274+ path : context . execution . namespacePath ,
275+ state : stateTarget . state ,
276+ chart : chart ,
277+ actions : getCanTransitionActions (
278+ config . actions ,
279+ chart ,
280+ stateTarget
281+ ) ,
282+ } ,
283+ } )
284+ }
285+
286+ return result
287+ } )
289288 )
290289
291290 return aggr
0 commit comments