Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save SiarheiFedartsou/9214c840cd80993cf224bfa0730bc195 to your computer and use it in GitHub Desktop.
Save SiarheiFedartsou/9214c840cd80993cf224bfa0730bc195 to your computer and use it in GitHub Desktop.
final class Job<R, E: Error> {
private let semaphore = DispatchSemaphore(value: 0)
var result: Result<R, E>? {
didSet {
semaphore.signal()
}
}
func await() throws -> R {
semaphore.wait()
guard let result = result else { fatalError("Oops") }
if let value = result.value {
return value
} else if let error = result.error {
throw error
} else {
fatalError("Oops")
}
}
}
func await<R1, E1, R2, E2>(_ a: Job<R1, E1>, _ b: Job<R2, E2>) throws -> (R1, R2) {
return (try a.await(), try b.await())
}
func await<R1, E1, R2, E2, R3, E3>(_ a: Job<R1, E1>, _ b: Job<R2, E2>, _ c: Job<R3, E3>) throws -> (R1, R2, R3) {
return (try a.await(), try b.await(), try c.await())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment