Skip to content

Commit b9d7206

Browse files
committed
[stdlib] Start generalizing Result
- Allow nonescapable `Success` types - Generalize `Sendable` conformance - Generalize `Result.mapError` - Generalize `Result.get()` Do not generalize `Result.init(catching:)` or higher-order functions involving the success value: they cannot possibly work correctly yet.
1 parent 0d92683 commit b9d7206

File tree

1 file changed

+28
-21
lines changed

1 file changed

+28
-21
lines changed

stdlib/public/core/Result.swift

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,19 @@
1313
/// A value that represents either a success or a failure, including an
1414
/// associated value in each case.
1515
@frozen
16-
public enum Result<Success: ~Copyable, Failure: Error> {
16+
public enum Result<Success: ~Copyable & ~Escapable, Failure: Error> {
1717
/// A success, storing a `Success` value.
1818
case success(Success)
1919

2020
/// A failure, storing a `Failure` value.
2121
case failure(Failure)
2222
}
2323

24-
extension Result: Copyable where Success: Copyable {}
24+
extension Result: Copyable where Success: Copyable /*& ~Escapable*/ {}
2525

26-
extension Result: Sendable where Success: Sendable & ~Copyable {}
26+
extension Result: Escapable where Success: Escapable /*& ~Copyable*/ {}
27+
28+
extension Result: Sendable where Success: Sendable & ~Copyable & ~Escapable {}
2729

2830
extension Result: Equatable where Success: Equatable, Failure: Equatable {}
2931

@@ -62,7 +64,9 @@ extension Result {
6264
return .failure(failure)
6365
}
6466
}
67+
}
6568

69+
extension Result {
6670
@_spi(SwiftStdlibLegacyABI) @available(swift, obsoleted: 1)
6771
@_silgen_name("$ss6ResultO3mapyAByqd__q_Gqd__xXElF")
6872
@usableFromInline
@@ -106,7 +110,7 @@ extension Result where Success: ~Copyable {
106110
}
107111
}
108112

109-
extension Result where Success: ~Copyable {
113+
extension Result where Success: ~Copyable & ~Escapable {
110114
/// Returns a new result, mapping any failure value using the given
111115
/// transformation.
112116
///
@@ -202,7 +206,9 @@ extension Result {
202206
return .failure(failure)
203207
}
204208
}
209+
}
205210

211+
extension Result {
206212
@_spi(SwiftStdlibLegacyABI) @available(swift, obsoleted: 1)
207213
@_silgen_name("$ss6ResultO7flatMapyAByqd__q_GADxXElF")
208214
@usableFromInline
@@ -246,7 +252,7 @@ extension Result where Success: ~Copyable {
246252
}
247253
}
248254

249-
extension Result where Success: ~Copyable {
255+
extension Result where Success: ~Copyable & ~Escapable {
250256
/// Returns a new result, mapping any failure value using the given
251257
/// transformation and unwrapping the produced result.
252258
///
@@ -283,7 +289,7 @@ extension Result {
283289
}
284290
}
285291

286-
extension Result where Success: ~Copyable {
292+
extension Result where Success: ~Copyable & ~Escapable {
287293
/// Returns the success value as a throwing expression.
288294
///
289295
/// Use this method to retrieve the value of this result if it represents a
@@ -311,21 +317,6 @@ extension Result where Success: ~Copyable {
311317
}
312318
}
313319

314-
extension Result where Success: ~Copyable {
315-
/// Creates a new result by evaluating a throwing closure, capturing the
316-
/// returned value as a success, or any thrown error as a failure.
317-
///
318-
/// - Parameter body: A potentially throwing closure to evaluate.
319-
@_alwaysEmitIntoClient
320-
public init(catching body: () throws(Failure) -> Success) {
321-
do {
322-
self = .success(try body())
323-
} catch {
324-
self = .failure(error)
325-
}
326-
}
327-
}
328-
329320
extension Result {
330321
/// ABI: Historical get() throws
331322
@_spi(SwiftStdlibLegacyABI) @available(swift, obsoleted: 1)
@@ -342,6 +333,22 @@ extension Result {
342333

343334
}
344335

336+
extension Result where Success: ~Copyable {
337+
/// Creates a new result by evaluating a throwing closure, capturing the
338+
/// returned value as a success, or any thrown error as a failure.
339+
///
340+
/// - Parameter body: A potentially throwing closure to evaluate.
341+
@_alwaysEmitIntoClient
342+
public init(catching body: () throws(Failure) -> Success) {
343+
// FIXME: This should allow a non-escapable `Success` -- but what's `self`'s lifetime dependence in that case?
344+
do {
345+
self = .success(try body())
346+
} catch {
347+
self = .failure(error)
348+
}
349+
}
350+
}
351+
345352
extension Result where Failure == Swift.Error {
346353
/// ABI: Historical init(catching:)
347354
@_spi(SwiftStdlibLegacyABI) @available(swift, obsoleted: 1)

0 commit comments

Comments
 (0)