Skip to content

Commit 1e88704

Browse files
committed
Improve addAnyHandler().
1 parent 87250b8 commit 1e88704

File tree

2 files changed

+46
-11
lines changed

2 files changed

+46
-11
lines changed

Sources/StateMachine.swift

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,9 @@ public final class StateMachine<S: StateType, E: EventType>: Machine<S, E>
268268
//--------------------------------------------------
269269

270270
// MARK: addHandler (no-event)
271-
271+
272+
/// Add `handler` that is called when `tryState()` succeeds for target `transition`.
273+
/// - Note: `handler` will not be invoked for `tryEvent()`.
272274
public func addHandler(transition: Transition<S>, order: HandlerOrder = _defaultOrder, handler: Handler) -> Disposable
273275
{
274276
if self._handlers[transition] == nil {
@@ -310,10 +312,17 @@ public final class StateMachine<S: StateType, E: EventType>: Machine<S, E>
310312

311313
// MARK: addAnyHandler (event-based & state-based)
312314

313-
public func addAnyHandler(order order: HandlerOrder = _defaultOrder, handler: Handler) -> Disposable
315+
/// Add `handler` that is called when either `tryEvent()` or `tryState()` succeeds for target `transition`.
316+
public func addAnyHandler(transition: Transition<S>, order: HandlerOrder = _defaultOrder, handler: Handler) -> Disposable
314317
{
315-
let disposable1 = self.addHandler(.Any => .Any, order: order, handler: handler)
316-
let disposable2 = self.addHandler(event: .Any, order: order, handler: handler)
318+
let disposable1 = self.addHandler(transition, order: order, handler: handler)
319+
let disposable2 = self.addHandler(event: .Any, order: order) { context in
320+
if (transition.fromState == .Any || transition.fromState == context.fromState) &&
321+
(transition.toState == .Any || transition.toState == context.toState)
322+
{
323+
handler(context)
324+
}
325+
}
317326

318327
return ActionDisposable {
319328
disposable1.dispose()

Tests/StateMachineEventTests.swift

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ class StateMachineEventTests: _TestCase
381381

382382
func testAddAnyHandler()
383383
{
384-
var invokeCount = 0
384+
var invokeCounts = [0, 0, 0, 0, 0, 0]
385385

386386
let machine = StateMachine<MyState, MyEvent>(state: .State0) { machine in
387387

@@ -394,28 +394,54 @@ class StateMachineEventTests: _TestCase
394394
// add 2 => 3 (state-based)
395395
machine.addRoute(.State2 => .State3)
396396

397+
//
397398
// addAnyHandler (for both event-based & state-based)
398-
machine.addAnyHandler { context in
399-
invokeCount++
400-
return
399+
//
400+
401+
machine.addAnyHandler(.State0 => .State1) { context in
402+
invokeCounts[0]++
403+
}
404+
405+
machine.addAnyHandler(.State1 => .State2) { context in
406+
invokeCounts[1]++
407+
}
408+
409+
machine.addAnyHandler(.State2 => .State3) { context in
410+
invokeCounts[2]++
411+
}
412+
413+
machine.addAnyHandler(.Any => .State3) { context in
414+
invokeCounts[3]++
415+
}
416+
417+
machine.addAnyHandler(.State0 => .Any) { context in
418+
invokeCounts[4]++
419+
}
420+
421+
machine.addAnyHandler(.Any => .Any) { context in
422+
invokeCounts[5]++
401423
}
402424

403425
}
404426

427+
// initial
428+
XCTAssertEqual(machine.state, MyState.State0)
429+
XCTAssertEqual(invokeCounts, [0, 0, 0, 0, 0, 0])
430+
405431
// tryEvent
406432
machine <-! .Event0
407433
XCTAssertEqual(machine.state, MyState.State1)
408-
XCTAssertEqual(invokeCount, 1)
434+
XCTAssertEqual(invokeCounts, [1, 0, 0, 0, 1, 1])
409435

410436
// tryEvent
411437
machine <-! .Event0
412438
XCTAssertEqual(machine.state, MyState.State2)
413-
XCTAssertEqual(invokeCount, 2)
439+
XCTAssertEqual(invokeCounts, [1, 1, 0, 0, 1, 2])
414440

415441
// tryState
416442
machine <- .State3
417443
XCTAssertEqual(machine.state, MyState.State3)
418-
XCTAssertEqual(invokeCount, 3)
444+
XCTAssertEqual(invokeCounts, [1, 1, 1, 1, 1, 3])
419445

420446
}
421447

0 commit comments

Comments
 (0)