Chain of events
Use an enum to structure the call stack.
publicindirectenumChain{case end
case complete(E.Function?)case link(E.Function,Chain)case background(E.Function,Chain)case multi([Chain])}letoutput=Chain.link(.out {"First"},.link(.in {print("Value: \($0)")},.multi([.multi([.end,.end,.end
]),.link(.out {"Link"},.link(.out {"Last"},.complete(.inout { value inguard case .string(let value)= value else{XCTFail()return.void
}return.string("\(value) !!!")})))]))).run(name:"ChainTests-testOutput")(lldb) po output
▿ Variable
▿ array :2 elements
▿0: Variable
- string :"First"▿1: Variable
▿ array :2 elements
-0: E.Variable.void
▿1: Variable
▿ array :2 elements
▿0: Variable
▿ array :3 elements
▿0: Variable
▿ array :1 element
-0: E.Variable.void
▿1: Variable
▿ array :1 element
-0: E.Variable.void
▿2: Variable
▿ array :1 element
-0: E.Variable.void
▿1: Variable
▿ array :2 elements
▿0: Variable
- string :"Link"▿1: Variable
▿ array :2 elements
▿0: Variable
- string :"Last"▿1: Variable
▿ array :1 element
▿0: Variable
- string :"Last !!!"(lldb) po output.flatten
▿ Variable
▿ array :8 elements
▿0: Variable
- string :"First"-1: E.Variable.void
-2: E.Variable.void
-3: E.Variable.void
-4: E.Variable.void
▿5: Variable
- string :"Link"▿6: Variable
- string :"Last"▿7: Variable
- string :"Last !!!"