File tree Expand file tree Collapse file tree 3 files changed +55
-80
lines changed Expand file tree Collapse file tree 3 files changed +55
-80
lines changed Original file line number Diff line number Diff line change 1+ actor Channel < Success: Sendable , Failure: Error > : Sendable {
2+ private var waiters = [ Waiter < Success , Failure > ] ( )
3+ private var result : Result < Success , Failure > ?
4+ }
5+
6+ typealias Waiter < Success, Failure> = CheckedContinuation < Success , Error >
7+
8+ extension Channel {
9+ @discardableResult
10+ func fulfill( _ success: Success ) -> Bool {
11+ guard result == nil else {
12+ return true
13+ }
14+
15+ result = . success( success)
16+
17+ while let waiter = waiters. popLast ( ) {
18+ waiter. resume ( returning: success)
19+ }
20+
21+ return false
22+ }
23+
24+ @discardableResult
25+ func fail( _ failure: Failure ) -> Bool {
26+ guard result == nil else {
27+ return true
28+ }
29+
30+ result = . failure( failure)
31+
32+ while let waiter = waiters. popLast ( ) {
33+ waiter. resume ( throwing: failure)
34+ }
35+
36+ return false
37+ }
38+
39+ var value : Success {
40+ get async throws {
41+ try await withCheckedThrowingContinuation { continuation in
42+ Task {
43+ switch result {
44+ case let . success( success) :
45+ continuation. resume ( returning: success)
46+ case let . failure( failure) :
47+ continuation. resume ( throwing: failure)
48+ case nil :
49+ waiters. append ( continuation)
50+ }
51+ }
52+ }
53+ }
54+ }
55+ }
Load Diff This file was deleted.
Load Diff This file was deleted.
You can’t perform that action at this time.
0 commit comments