Skip to content

Commit 15ff327

Browse files
Merge pull request #27 from bjschoenfeld/refactor/simplify-channel
2 parents 3945e9c + cf261ba commit 15ff327

File tree

3 files changed

+55
-80
lines changed

3 files changed

+55
-80
lines changed

Sources/AsyncDataLoader/Channel.swift

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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+
}

Sources/AsyncDataLoader/Channel/Channel.swift

Lines changed: 0 additions & 55 deletions
This file was deleted.

Sources/AsyncDataLoader/Channel/State.swift

Lines changed: 0 additions & 25 deletions
This file was deleted.

0 commit comments

Comments
 (0)