Added cyclic state
This commit is contained in:
parent
25ab17179d
commit
3fd2952b2d
|
@ -47,6 +47,7 @@ public extension StateResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
public indirect enum State {
|
public indirect enum State {
|
||||||
|
case cyclic(action: StateAction, to: State, while: () -> Bool)
|
||||||
case some(with: StateResult)
|
case some(with: StateResult)
|
||||||
case transition(to: State, with: StateResult)
|
case transition(to: State, with: StateResult)
|
||||||
}
|
}
|
||||||
|
@ -54,6 +55,14 @@ public indirect enum State {
|
||||||
public extension State {
|
public extension State {
|
||||||
func run() {
|
func run() {
|
||||||
switch self {
|
switch self {
|
||||||
|
case .cyclic(let action, let to, let statement):
|
||||||
|
guard statement() else {
|
||||||
|
return to.run()
|
||||||
|
}
|
||||||
|
|
||||||
|
action.act()
|
||||||
|
run()
|
||||||
|
|
||||||
case .some(let action):
|
case .some(let action):
|
||||||
action.resolve()
|
action.resolve()
|
||||||
|
|
||||||
|
|
|
@ -72,8 +72,35 @@ final class ETests: XCTestCase {
|
||||||
attemptRetryLogin.run()
|
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 = [
|
static var allTests = [
|
||||||
("testExample", testExample),
|
("testExample", testExample),
|
||||||
("testState", testState)
|
("testState", testState),
|
||||||
|
("testCyclicState", testCyclicState)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue