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