Chain/README.md

112 lines
2.8 KiB
Markdown

# Chain ⛓
*Chain of events*
Use an enum to structure the call stack.
```swift
public indirect enum Chain {
case end
case complete(E.Function?)
case link(E.Function, Chain)
case background(E.Function, Chain)
case multi([Chain])
}
```
## Example Code
```swift
let output = Chain.link(
.out { "First" },
.link(
.in {
print("Value: \($0)")
},
.multi(
[
.multi(
[
.end,
.end,
.end
]
),
.link(
.out { "Link" },
.link(
.out { "Last" },
.complete(
.inout { value in
guard case .string(let value) = value else {
XCTFail()
return .void
}
return .string("\(value) !!!")
}
)
)
)
]
)
)
)
.run(name: "ChainTests-testOutput")
```
## Normal Chain Output
```swift
(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 !!!"
```
## Flattened Chain Output
```swift
(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 !!!"
```