Added cyclic state

This commit is contained in:
0xLeif 2020-10-31 14:47:07 -05:00
parent 25ab17179d
commit 3fd2952b2d
2 changed files with 37 additions and 1 deletions

View File

@ -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()

View File

@ -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)
]
}