Skip to content

Commit bef1003

Browse files
committed
Support multiple emits
1 parent 0f79642 commit bef1003

File tree

4 files changed

+32
-32
lines changed

4 files changed

+32
-32
lines changed

Swift/Sources/StateMachine/StateMachine.swift

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,13 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
1313
public struct Valid: CustomDebugStringConvertible {
1414

1515
public var debugDescription: String {
16-
guard let sideEffect: SideEffect = sideEffect
17-
else { return "fromState: \(fromState), event: \(event), toState: \(toState), sideEffect: nil" }
18-
return "fromState: \(fromState), event: \(event), toState: \(toState), sideEffect: \(sideEffect)"
16+
return "fromState: \(fromState), event: \(event), toState: \(toState), sideEffect: \(sideEffects)"
1917
}
2018

2119
public let fromState: State
2220
public let event: Event
2321
public let toState: State
24-
public let sideEffect: SideEffect?
22+
public let sideEffects: [SideEffect]
2523
}
2624

2725
public struct Invalid: Error, Equatable {}
@@ -105,7 +103,7 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
105103
let transition: Transition.Valid = .init(fromState: state,
106104
event: event,
107105
toState: action.toState ?? state,
108-
sideEffect: action.sideEffect)
106+
sideEffects: action.sideEffects)
109107
if let toState: State = action.toState {
110108
state = toState
111109
}
@@ -197,15 +195,15 @@ extension StateMachineBuilder {
197195

198196
public static func transition(
199197
to state: State,
200-
emit sideEffect: SideEffect? = nil
198+
emit sideEffect: SideEffect...
201199
) -> Action {
202-
Action(toState: state, sideEffect: sideEffect)
200+
Action(toState: state, sideEffects: sideEffect)
203201
}
204202

205203
public static func dontTransition(
206-
emit sideEffect: SideEffect? = nil
204+
emit sideEffect: SideEffect...
207205
) -> Action {
208-
Action(toState: nil, sideEffect: sideEffect)
206+
Action(toState: nil, sideEffects: sideEffect)
209207
}
210208

211209
public static func onTransition(
@@ -288,7 +286,7 @@ public enum StateMachineTypes {
288286
fileprivate typealias Factory = (State, Event) throws -> Self
289287

290288
fileprivate let toState: State?
291-
fileprivate let sideEffect: SideEffect?
289+
fileprivate let sideEffects: [SideEffect]
292290
}
293291

294292
public struct IncorrectTypeError: Error, CustomDebugStringConvertible {

Swift/Tests/StateMachineTests/StateMachineTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ final class StateMachineTests: XCTestCase, StateMachineBuilder {
6666
expect(transition).to(equal(ValidTransition(fromState: .stateOne,
6767
event: .eventOne,
6868
toState: .stateOne,
69-
sideEffect: .commandOne)))
69+
sideEffects: [.commandOne])))
7070
}
7171

7272
func testTransition() throws {
@@ -82,7 +82,7 @@ final class StateMachineTests: XCTestCase, StateMachineBuilder {
8282
expect(transition).to(equal(ValidTransition(fromState: .stateOne,
8383
event: .eventTwo,
8484
toState: .stateTwo,
85-
sideEffect: .commandTwo)))
85+
sideEffects: [.commandTwo])))
8686
}
8787

8888
func testInvalidTransition() throws {
@@ -131,16 +131,16 @@ final class StateMachineTests: XCTestCase, StateMachineBuilder {
131131
.success(ValidTransition(fromState: .stateOne,
132132
event: .eventOne,
133133
toState: .stateOne,
134-
sideEffect: .commandOne)),
134+
sideEffects: [.commandOne])),
135135
.success(ValidTransition(fromState: .stateOne,
136136
event: .eventTwo,
137137
toState: .stateTwo,
138-
sideEffect: .commandTwo)),
138+
sideEffects: [.commandTwo])),
139139
.failure(InvalidTransition()),
140140
.success(ValidTransition(fromState: .stateTwo,
141141
event: .eventTwo,
142142
toState: .stateTwo,
143-
sideEffect: .commandThree))
143+
sideEffects: [.commandThree]))
144144
]))
145145
}
146146

Swift/Tests/StateMachineTests/StateMachine_Matter_Tests.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,14 @@ final class StateMachine_Matter_Tests: XCTestCase, StateMachineBuilder {
5858
}
5959
}
6060
onTransition {
61-
guard case let .success(transition) = $0, let sideEffect = transition.sideEffect else { return }
62-
switch sideEffect {
63-
case .logMelted: logger.log(Message.melted)
64-
case .logFrozen: logger.log(Message.frozen)
65-
case .logVaporized: logger.log(Message.vaporized)
66-
case .logCondensed: logger.log(Message.condensed)
61+
guard case let .success(transition) = $0 else { return }
62+
transition.sideEffects.forEach { sideEffect in
63+
switch sideEffect {
64+
case .logMelted: logger.log(Message.melted)
65+
case .logFrozen: logger.log(Message.frozen)
66+
case .logVaporized: logger.log(Message.vaporized)
67+
case .logCondensed: logger.log(Message.condensed)
68+
}
6769
}
6870
}
6971
}
@@ -100,7 +102,7 @@ final class StateMachine_Matter_Tests: XCTestCase, StateMachineBuilder {
100102
expect(transition).to(equal(ValidTransition(fromState: .solid,
101103
event: .melt,
102104
toState: .liquid,
103-
sideEffect: .logMelted)))
105+
sideEffects: [.logMelted])))
104106
expect(self.logger).to(log(Message.melted))
105107
}
106108

@@ -133,7 +135,7 @@ final class StateMachine_Matter_Tests: XCTestCase, StateMachineBuilder {
133135
expect(transition).to(equal(ValidTransition(fromState: .liquid,
134136
event: .freeze,
135137
toState: .solid,
136-
sideEffect: .logFrozen)))
138+
sideEffects: [.logFrozen])))
137139
expect(self.logger).to(log(Message.frozen))
138140
}
139141

@@ -150,7 +152,7 @@ final class StateMachine_Matter_Tests: XCTestCase, StateMachineBuilder {
150152
expect(transition).to(equal(ValidTransition(fromState: .liquid,
151153
event: .vaporize,
152154
toState: .gas,
153-
sideEffect: .logVaporized)))
155+
sideEffects: [.logVaporized])))
154156
expect(self.logger).to(log(Message.vaporized))
155157
}
156158

@@ -167,7 +169,7 @@ final class StateMachine_Matter_Tests: XCTestCase, StateMachineBuilder {
167169
expect(transition).to(equal(ValidTransition(fromState: .gas,
168170
event: .condense,
169171
toState: .liquid,
170-
sideEffect: .logCondensed)))
172+
sideEffects: [.logCondensed])))
171173
expect(self.logger).to(log(Message.condensed))
172174
}
173175
}

Swift/Tests/StateMachineTests/StateMachine_Turnstile_Tests.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ final class StateMachine_Turnstile_Tests: XCTestCase, StateMachineBuilder {
9595
expect(transition).to(equal(ValidTransition(fromState: .locked(credit: 0),
9696
event: .insertCoin(10),
9797
toState: .locked(credit: 10),
98-
sideEffect: nil)))
98+
sideEffects: [])))
9999
}
100100

101101
func test_givenStateIsLocked_whenInsertCoin_andCreditEqualsFarePrice_shouldTransitionToUnlockedStateAndOpenDoors() throws {
@@ -111,7 +111,7 @@ final class StateMachine_Turnstile_Tests: XCTestCase, StateMachineBuilder {
111111
expect(transition).to(equal(ValidTransition(fromState: .locked(credit: 35),
112112
event: .insertCoin(15),
113113
toState: .unlocked,
114-
sideEffect: .openDoors)))
114+
sideEffects: [.openDoors])))
115115
}
116116

117117
func test_givenStateIsLocked_whenInsertCoin_andCreditMoreThanFarePrice_shouldTransitionToUnlockedStateAndOpenDoors() throws {
@@ -127,7 +127,7 @@ final class StateMachine_Turnstile_Tests: XCTestCase, StateMachineBuilder {
127127
expect(transition).to(equal(ValidTransition(fromState: .locked(credit: 35),
128128
event: .insertCoin(20),
129129
toState: .unlocked,
130-
sideEffect: .openDoors)))
130+
sideEffects: [.openDoors])))
131131
}
132132

133133
func test_givenStateIsLocked_whenAdmitPerson_shouldTransitionToLockedStateAndSoundAlarm() throws {
@@ -143,7 +143,7 @@ final class StateMachine_Turnstile_Tests: XCTestCase, StateMachineBuilder {
143143
expect(transition).to(equal(ValidTransition(fromState: .locked(credit: 35),
144144
event: .admitPerson,
145145
toState: .locked(credit: 35),
146-
sideEffect: .soundAlarm)))
146+
sideEffects: [.soundAlarm])))
147147
}
148148

149149
func test_givenStateIsLocked_whenMachineDidFail_shouldTransitionToBrokenStateAndOrderRepair() throws {
@@ -159,7 +159,7 @@ final class StateMachine_Turnstile_Tests: XCTestCase, StateMachineBuilder {
159159
expect(transition).to(equal(ValidTransition(fromState: .locked(credit: 15),
160160
event: .machineDidFail,
161161
toState: .broken(oldState: .locked(credit: 15)),
162-
sideEffect: .orderRepair)))
162+
sideEffects: [.orderRepair])))
163163
}
164164

165165
func test_givenStateIsUnlocked_whenAdmitPerson_shouldTransitionToLockedStateAndCloseDoors() throws {
@@ -175,7 +175,7 @@ final class StateMachine_Turnstile_Tests: XCTestCase, StateMachineBuilder {
175175
expect(transition).to(equal(ValidTransition(fromState: .unlocked,
176176
event: .admitPerson,
177177
toState: .locked(credit: 0),
178-
sideEffect: .closeDoors)))
178+
sideEffects: [.closeDoors])))
179179
}
180180

181181
func test_givenStateIsBroken_whenMachineRepairDidComplete_shouldTransitionToLockedState() throws {
@@ -191,7 +191,7 @@ final class StateMachine_Turnstile_Tests: XCTestCase, StateMachineBuilder {
191191
expect(transition).to(equal(ValidTransition(fromState: .broken(oldState: .locked(credit: 15)),
192192
event: .machineRepairDidComplete,
193193
toState: .locked(credit: 15),
194-
sideEffect: nil)))
194+
sideEffects: [])))
195195
}
196196
}
197197

0 commit comments

Comments
 (0)