Skip to content

Commit 53d7c9f

Browse files
author
Brandon Schoenfeld
committed
refactor: combine Channel Success and Failure into a single Result object
1 parent fd5c11d commit 53d7c9f

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

Sources/AsyncDataLoader/Channel.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
actor Channel<Success: Sendable, Failure: Error>: Sendable {
22
private var waiters = [Waiter<Success, Failure>]()
3-
private var result: Success?
4-
private var failure: Failure?
3+
private var result: Result<Success, Failure>?
54
}
65

76
typealias Waiter<Success, Failure> = CheckedContinuation<Success, Error>
87

98
extension Channel {
109
@discardableResult
11-
func fulfill(_ value: Success) -> Bool {
10+
func fulfill(_ success: Success) -> Bool {
1211
if result == nil {
13-
result = value
12+
result = .success(success)
1413

1514
while let waiter = waiters.popLast() {
1615
waiter.resume(returning: success)
@@ -24,8 +23,8 @@ extension Channel {
2423

2524
@discardableResult
2625
func fail(_ failure: Failure) -> Bool {
27-
if self.failure == nil {
28-
self.failure = failure
26+
if result == nil {
27+
result = .failure(failure)
2928

3029
while let waiter = waiters.popLast() {
3130
waiter.resume(throwing: failure)
@@ -41,11 +40,12 @@ extension Channel {
4140
get async throws {
4241
try await withCheckedThrowingContinuation { continuation in
4342
Task {
44-
if let result = self.result {
45-
continuation.resume(returning: result)
46-
} else if let failure = self.failure {
43+
switch result {
44+
case let .success(success):
45+
continuation.resume(returning: success)
46+
case let .failure(failure):
4747
continuation.resume(throwing: failure)
48-
} else {
48+
case nil:
4949
waiters.append(continuation)
5050
}
5151
}

0 commit comments

Comments
 (0)