Skip to content

Commit db7e6b5

Browse files
committed
fix: add completion-based future
1 parent 0fa17ce commit db7e6b5

File tree

4 files changed

+60
-1
lines changed

4 files changed

+60
-1
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// Receivables+Future.swift
3+
// ComposableRequest
4+
//
5+
// Created by Stefano Bertagno on 27/08/21.
6+
//
7+
8+
import Foundation
9+
10+
public extension Receivables {
11+
/// A `struct` defining a future receivable.
12+
struct Future<Requester: Requests.Requester, Success>: Receivable {
13+
/// The completion handler.
14+
public let completion: (@escaping (Result<Success, Error>) -> Void) -> Void
15+
16+
/// Init.
17+
///
18+
/// - parameters:
19+
/// - requester: A valid `Requester`.
20+
/// - completion: A valid completion handler.
21+
public init(with requester: Requester, _ completion: @escaping (@escaping (Result<Success, Error>) -> Void) -> Void) {
22+
self.completion = completion
23+
}
24+
}
25+
}

Sources/Requests/Requester/Async/URLSessionAsyncReceivable.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,21 @@ where Parent: URLSessionAsyncReceivable {
8484
}
8585
}
8686

87+
@available(iOS 15, macOS 12, watchOS 8, tvOS 15, *)
88+
extension Receivables.Future: URLSessionAsyncReceivable, URLSessionAsyncMockReceivable
89+
where Requester.Output: URLSessionAsyncReceivable {
90+
// swiftlint:disable empty_parentheses_with_trailing_closure
91+
/// The underlying response.
92+
public var response: URLSessionAsyncRequester.Response<Success> {
93+
.init(priority: nil) {
94+
try await withCheckedContinuation { resolve in
95+
self.completion() { resolve.resume(returning: $0) }
96+
}.get()
97+
}
98+
}
99+
// swiftlint:enable empty_parentheses_with_trailing_closure
100+
}
101+
87102
@available(iOS 15, macOS 12, watchOS 8, tvOS 15, *)
88103
extension Receivables.If: URLSessionAsyncReceivable, URLSessionAsyncMockReceivable
89104
where O1: URLSessionAsyncReceivable, O2: URLSessionAsyncReceivable {

Sources/Requests/Requester/Combine/URLSessionCombineReceivable.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ where Parent: URLSessionCombineReceivable {
7373
}
7474
}
7575

76+
@available(iOS 13, macOS 10.15, tvOS 13, watchOS 6, *)
77+
extension Receivables.Future: URLSessionCombineReceivable, URLSessionCombineMockReceivable
78+
where Requester: URLSessionCombineReceivable {
79+
/// The underlying response.
80+
public var response: URLSessionCombineRequester.Response<Success> {
81+
.init(publisher: Future { resolve in self.completion { resolve($0) } })
82+
}
83+
}
84+
7685
@available(iOS 13, macOS 10.15, tvOS 13, watchOS 6, *)
7786
extension Receivables.If: URLSessionCombineReceivable, URLSessionCombineMockReceivable
7887
where O1: URLSessionCombineReceivable, O2: URLSessionCombineReceivable {

Sources/Requests/Requester/Completion/URLSessionCompletionReceivable.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,16 @@ where Parent: URLSessionCompletionReceivable {
7979
}
8080
}
8181

82+
extension Receivables.Future: URLSessionCompletionReceivable, URLSessionCompletionMockReceivable
83+
where Requester.Output: URLSessionCompletionReceivable {
84+
/// The response.
85+
public var response: URLSessionCompletionRequester.Response<Success> {
86+
let promise = Promise<Success, Error>()
87+
completion { promise.resolve(result: $0) }
88+
return .init(future: promise.future)
89+
}
90+
}
91+
8292
extension Receivables.If: URLSessionCompletionReceivable, URLSessionCompletionMockReceivable
8393
where O1: URLSessionCompletionReceivable, O2: URLSessionCompletionReceivable {
8494
/// The response.
@@ -107,7 +117,7 @@ extension Receivables.Once: URLSessionCompletionReceivable, URLSessionCompletion
107117
where Requester.Output: URLSessionCompletionReceivable {
108118
/// The response.
109119
public var response: URLSessionCompletionRequester.Response<Success> {
110-
.init(task: nil, future: .init(result: result))
120+
.init(future: .init(result: result))
111121
}
112122
}
113123

0 commit comments

Comments
 (0)