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