Added cyclic state
This commit is contained in:
parent
25ab17179d
commit
3fd2952b2d
|
@ -47,6 +47,7 @@ public extension StateResult {
|
|||
}
|
||||
|
||||
public indirect enum State {
|
||||
case cyclic(action: StateAction, to: State, while: () -> Bool)
|
||||
case some(with: StateResult)
|
||||
case transition(to: State, with: StateResult)
|
||||
}
|
||||
|
@ -54,6 +55,14 @@ public indirect enum State {
|
|||
public extension State {
|
||||
func run() {
|
||||
switch self {
|
||||
case .cyclic(let action, let to, let statement):
|
||||
guard statement() else {
|
||||
return to.run()
|
||||
}
|
||||
|
||||
action.act()
|
||||
run()
|
||||
|
||||
case .some(let action):
|
||||
action.resolve()
|
||||
|
||||
|
|
|
@ -72,8 +72,35 @@ final class ETests: XCTestCase {
|
|||
attemptRetryLogin.run()
|
||||
}
|
||||
|
||||
func testCyclicState() {
|
||||
var value: Variable = .int(0)
|
||||
let maxValue: Variable = .int(256)
|
||||
let incValue: Function = .void {
|
||||
value = value.update { .int($0 + 1) }
|
||||
}
|
||||
let boolFunc: Function = .out {
|
||||
.bool(value.value() ?? 0 < maxValue.value() ?? 0)
|
||||
}
|
||||
|
||||
let finState = State.some(with: .some(action: .some(.void({
|
||||
print("DONE!")
|
||||
XCTAssert(true)
|
||||
}))))
|
||||
|
||||
let cyclicState = State.cyclic(action: .some(incValue), to: finState) {
|
||||
boolFunc()?.value() ?? false
|
||||
}
|
||||
|
||||
XCTAssertEqual(value.value(), 0)
|
||||
|
||||
cyclicState.run()
|
||||
|
||||
XCTAssertEqual(value.value(), 256)
|
||||
}
|
||||
|
||||
static var allTests = [
|
||||
("testExample", testExample),
|
||||
("testState", testState)
|
||||
("testState", testState),
|
||||
("testCyclicState", testCyclicState)
|
||||
]
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue