Skip to content
This repository was archived by the owner on Aug 29, 2022. It is now read-only.

Commit 3a855e2

Browse files
committed
Collapse down generic where clauses using TaskProtocol
1 parent a78d820 commit 3a855e2

File tree

12 files changed

+95
-148
lines changed

12 files changed

+95
-148
lines changed

Deferred.xcodeproj/project.pbxproj

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
DB126D321E5368A900054E95 /* ResultRecovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CA41D85200C00DDF16D /* ResultRecovery.swift */; };
6868
DB126D331E5368A900054E95 /* TaskResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CA61D85200C00DDF16D /* TaskResult.swift */; };
6969
DB126D341E5368AD00054E95 /* ExistentialTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CA91D85200C00DDF16D /* ExistentialTask.swift */; };
70-
DB126D351E5368AD00054E95 /* ResultFuture.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAB1D85200C00DDF16D /* ResultFuture.swift */; };
7170
DB126D371E5368AD00054E95 /* TaskAndThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAF1D85200C00DDF16D /* TaskAndThen.swift */; };
7271
DB126D381E5368AD00054E95 /* TaskCollections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAE1D85200C00DDF16D /* TaskCollections.swift */; };
7372
DB126D3A1E5368AD00054E95 /* TaskIgnore.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAA1D85200C00DDF16D /* TaskIgnore.swift */; };
@@ -76,7 +75,6 @@
7675
DB126D3D1E5368AD00054E95 /* TaskRecovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CB21D85200C00DDF16D /* TaskRecovery.swift */; };
7776
DB126D3E1E5368AD00054E95 /* TaskAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CA81D85200C00DDF16D /* TaskAsync.swift */; };
7877
DB126D3F1E5368AD00054E95 /* ExistentialTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CA91D85200C00DDF16D /* ExistentialTask.swift */; };
79-
DB126D401E5368AD00054E95 /* ResultFuture.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAB1D85200C00DDF16D /* ResultFuture.swift */; };
8078
DB126D421E5368AD00054E95 /* TaskAndThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAF1D85200C00DDF16D /* TaskAndThen.swift */; };
8179
DB126D431E5368AD00054E95 /* TaskCollections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAE1D85200C00DDF16D /* TaskCollections.swift */; };
8280
DB126D451E5368AD00054E95 /* TaskIgnore.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAA1D85200C00DDF16D /* TaskIgnore.swift */; };
@@ -85,7 +83,6 @@
8583
DB126D481E5368AD00054E95 /* TaskRecovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CB21D85200C00DDF16D /* TaskRecovery.swift */; };
8684
DB126D491E5368AD00054E95 /* TaskAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CA81D85200C00DDF16D /* TaskAsync.swift */; };
8785
DB126D4A1E5368AE00054E95 /* ExistentialTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CA91D85200C00DDF16D /* ExistentialTask.swift */; };
88-
DB126D4B1E5368AE00054E95 /* ResultFuture.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAB1D85200C00DDF16D /* ResultFuture.swift */; };
8986
DB126D4D1E5368AE00054E95 /* TaskAndThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAF1D85200C00DDF16D /* TaskAndThen.swift */; };
9087
DB126D4E1E5368AE00054E95 /* TaskCollections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAE1D85200C00DDF16D /* TaskCollections.swift */; };
9188
DB126D501E5368AE00054E95 /* TaskIgnore.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAA1D85200C00DDF16D /* TaskIgnore.swift */; };
@@ -94,7 +91,6 @@
9491
DB126D531E5368AE00054E95 /* TaskRecovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CB21D85200C00DDF16D /* TaskRecovery.swift */; };
9592
DB126D541E5368AE00054E95 /* TaskAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CA81D85200C00DDF16D /* TaskAsync.swift */; };
9693
DB126D551E5368AE00054E95 /* ExistentialTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CA91D85200C00DDF16D /* ExistentialTask.swift */; };
97-
DB126D561E5368AE00054E95 /* ResultFuture.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAB1D85200C00DDF16D /* ResultFuture.swift */; };
9894
DB126D581E5368AE00054E95 /* TaskAndThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAF1D85200C00DDF16D /* TaskAndThen.swift */; };
9995
DB126D591E5368AE00054E95 /* TaskCollections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAE1D85200C00DDF16D /* TaskCollections.swift */; };
10096
DB126D5B1E5368AE00054E95 /* TaskIgnore.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB524CAA1D85200C00DDF16D /* TaskIgnore.swift */; };
@@ -280,7 +276,6 @@
280276
DB524CA81D85200C00DDF16D /* TaskAsync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskAsync.swift; sourceTree = "<group>"; };
281277
DB524CA91D85200C00DDF16D /* ExistentialTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExistentialTask.swift; sourceTree = "<group>"; };
282278
DB524CAA1D85200C00DDF16D /* TaskIgnore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskIgnore.swift; sourceTree = "<group>"; };
283-
DB524CAB1D85200C00DDF16D /* ResultFuture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResultFuture.swift; sourceTree = "<group>"; };
284279
DB524CAE1D85200C00DDF16D /* TaskCollections.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskCollections.swift; sourceTree = "<group>"; };
285280
DB524CAF1D85200C00DDF16D /* TaskAndThen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskAndThen.swift; sourceTree = "<group>"; };
286281
DB524CB01D85200C00DDF16D /* TaskMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskMap.swift; sourceTree = "<group>"; };
@@ -423,7 +418,6 @@
423418
children = (
424419
DB524CA51D85200C00DDF16D /* Either.swift */,
425420
DB524CA91D85200C00DDF16D /* ExistentialTask.swift */,
426-
DB524CAB1D85200C00DDF16D /* ResultFuture.swift */,
427421
DB524CA41D85200C00DDF16D /* ResultRecovery.swift */,
428422
DB79ED6A214F0DF900E0FDEB /* Task.swift */,
429423
DB524CAF1D85200C00DDF16D /* TaskAndThen.swift */,
@@ -764,7 +758,6 @@
764758
DB126D341E5368AD00054E95 /* ExistentialTask.swift in Sources */,
765759
DB126D061E5368A100054E95 /* Protected.swift in Sources */,
766760
DB126D281E5368A700054E95 /* Either.swift in Sources */,
767-
DB126D351E5368AD00054E95 /* ResultFuture.swift in Sources */,
768761
DB126D291E5368A700054E95 /* ResultRecovery.swift in Sources */,
769762
DB126CFF1E5368A100054E95 /* Future.swift in Sources */,
770763
DB126D3E1E5368AD00054E95 /* TaskAsync.swift in Sources */,
@@ -831,7 +824,6 @@
831824
DB126D3F1E5368AD00054E95 /* ExistentialTask.swift in Sources */,
832825
DB126D111E5368A100054E95 /* Protected.swift in Sources */,
833826
DB126D2B1E5368A700054E95 /* Either.swift in Sources */,
834-
DB126D401E5368AD00054E95 /* ResultFuture.swift in Sources */,
835827
DB126D2C1E5368A700054E95 /* ResultRecovery.swift in Sources */,
836828
DB126D0A1E5368A100054E95 /* Future.swift in Sources */,
837829
DB126D491E5368AD00054E95 /* TaskAsync.swift in Sources */,
@@ -899,7 +891,6 @@
899891
DB126D4A1E5368AE00054E95 /* ExistentialTask.swift in Sources */,
900892
DB126D1C1E5368A200054E95 /* Protected.swift in Sources */,
901893
DB126D2E1E5368A800054E95 /* Either.swift in Sources */,
902-
DB126D4B1E5368AE00054E95 /* ResultFuture.swift in Sources */,
903894
DB126D2F1E5368A800054E95 /* ResultRecovery.swift in Sources */,
904895
DB126D151E5368A200054E95 /* Future.swift in Sources */,
905896
DB126D541E5368AE00054E95 /* TaskAsync.swift in Sources */,
@@ -967,7 +958,6 @@
967958
DB126D551E5368AE00054E95 /* ExistentialTask.swift in Sources */,
968959
DB126D271E5368A200054E95 /* Protected.swift in Sources */,
969960
DB126D311E5368A900054E95 /* Either.swift in Sources */,
970-
DB126D561E5368AE00054E95 /* ResultFuture.swift in Sources */,
971961
DB126D321E5368A900054E95 /* ResultRecovery.swift in Sources */,
972962
DB126D201E5368A200054E95 /* Future.swift in Sources */,
973963
DB126D5F1E5368AE00054E95 /* TaskAsync.swift in Sources */,

Sources/Task/ExistentialTask.swift

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
// Copyright © 2015-2018 Big Nerd Ranch. Licensed under MIT.
77
//
88

9-
import Dispatch
109
import Foundation
1110
#if SWIFT_PACKAGE
1211
import Atomics
@@ -63,15 +62,15 @@ public final class Task<SuccessValue>: NSObject {
6362
}
6463

6564
/// Creates a task whose `upon(_:execute:)` methods use those of `base`.
66-
public convenience init<Task: FutureProtocol>(_ base: Task, progress: Progress)
67-
where Task.Value: Either, Task.Value.Left == Error, Task.Value.Right == SuccessValue {
68-
self.init(future: Future(task: base), progress: progress)
65+
public convenience init<OtherTask: TaskProtocol>(_ base: OtherTask, progress: Progress) where OtherTask.SuccessValue == SuccessValue {
66+
let future = Future<Result>(task: base)
67+
self.init(future: future, progress: progress)
6968
}
7069

7170
/// Creates a task whose `upon(_:execute:)` methods use those of `base`.
72-
public convenience init<OtherFuture: FutureProtocol>(success base: OtherFuture, progress: Progress)
73-
where OtherFuture.Value == SuccessValue {
74-
self.init(future: Future(success: base), progress: progress)
71+
public convenience init<OtherFuture: FutureProtocol>(success base: OtherFuture, progress: Progress) where OtherFuture.Value == SuccessValue {
72+
let future = Future<Result>(success: base)
73+
self.init(future: future, progress: progress)
7574
}
7675
#else
7776
private let cancellation: () -> Void
@@ -143,37 +142,35 @@ extension Task {
143142
///
144143
/// `cancellation` will be called asynchronously, but not on any specific
145144
/// queue. If you must do work on a specific queue, schedule work on it.
146-
public convenience init<OtherFuture: FutureProtocol>(_ base: OtherFuture, cancellation: (() -> Void)? = nil)
147-
where OtherFuture.Value: Either, OtherFuture.Value.Left == Error, OtherFuture.Value.Right == SuccessValue {
148-
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
145+
public convenience init<OtherTask: TaskProtocol>(_ base: OtherTask, cancellation: (() -> Void)? = nil) where OtherTask.SuccessValue == SuccessValue {
146+
let future = Future<Result>(task: base)
147+
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
149148
let progress = Progress.wrappingSuccess(of: base, cancellation: cancellation)
150-
self.init(future: Future(task: base), progress: progress)
151-
#else
152-
let asTask = (base as? Task<SuccessValue>)
153-
154-
self.init(future: Future(task: base)) { [oldCancellation = asTask?.cancellation] in
155-
oldCancellation?()
149+
self.init(future: future, progress: progress)
150+
#else
151+
self.init(future: future) {
152+
base.cancel()
156153
cancellation?()
157154
}
158155

159156
if base.isCancelled {
160157
markCancelled(using: cancellation)
161158
}
162-
#endif
159+
#endif
163160
}
164161

165162
/// Creates a task whose `upon(_:execute:)` methods use those of `base`.
166163
///
167164
/// `cancellation` will be called asynchronously, but not on any specific
168165
/// queue. If you must do work on a specific queue, schedule work on it.
169-
public convenience init<OtherFuture: FutureProtocol>(success base: OtherFuture, cancellation: (() -> Void)? = nil)
170-
where OtherFuture.Value == SuccessValue {
171-
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
166+
public convenience init<OtherFuture: FutureProtocol>(success base: OtherFuture, cancellation: (() -> Void)? = nil) where OtherFuture.Value == SuccessValue {
167+
let future = Future<Result>(success: base)
168+
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
172169
let progress = Progress.wrappingCompletion(of: base, cancellation: cancellation)
173-
self.init(future: Future<Value>(success: base), progress: progress)
174-
#else
175-
self.init(future: Future<Value>(success: base))
176-
#endif
170+
self.init(future: future, progress: progress)
171+
#else
172+
self.init(future: future)
173+
#endif
177174
}
178175

179176
/// Creates an operation that has already completed with `value`.

Sources/Task/ResultFuture.swift

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

Sources/Task/Task.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ extension TaskProtocol {
8181

8282
extension Future: TaskProtocol where Value: Either, Value.Left == Error {
8383
public typealias SuccessValue = Value.Right
84+
85+
/// Create a future having the same underlying task as `other`.
86+
public init<OtherTask: TaskProtocol>(task other: OtherTask) where OtherTask.SuccessValue == SuccessValue, OtherTask.FailureValue == FailureValue {
87+
self = other as? Future<Value> ?? other.every {
88+
$0.withValues(ifLeft: Value.init(left:), ifRight: Value.init(right:))
89+
}
90+
}
91+
92+
/// Create a future having the same underlying task as `other`.
93+
public init<OtherFuture: FutureProtocol>(success other: OtherFuture) where OtherFuture.Value == SuccessValue {
94+
self = other.every(per: Value.init(right:))
95+
}
8496
}
8597

8698
extension Deferred: TaskProtocol where Value: Either, Value.Left == Error {

Sources/Task/TaskAndThen.swift

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Deferred
1212

1313
import Dispatch
1414

15-
extension Task {
15+
extension TaskProtocol {
1616
/// Begins another task by passing the result of the task to `startNextTask`
1717
/// once it completes successfully.
1818
///
@@ -21,8 +21,7 @@ extension Task {
2121
///
2222
/// Cancelling the resulting task will attempt to cancel both the receiving
2323
/// task and the created task.
24-
public func andThen<NewTask: FutureProtocol>(upon executor: PreferredExecutor, start startNextTask: @escaping(SuccessValue) throws -> NewTask) -> Task<NewTask.Value.Right>
25-
where NewTask.Value: Either, NewTask.Value.Left == Error {
24+
public func andThen<NewTask: TaskProtocol>(upon executor: PreferredExecutor, start startNextTask: @escaping(SuccessValue) throws -> NewTask) -> Task<NewTask.SuccessValue> {
2625
return andThen(upon: executor as Executor, start: startNextTask)
2726
}
2827

@@ -39,15 +38,14 @@ extension Task {
3938
/// `startNextTask` closure. `andThen` submits `startNextTask` to `executor`
4039
/// once the task completes successfully.
4140
/// - see: FutureProtocol.andThen(upon:start:)
42-
public func andThen<NewTask: FutureProtocol>(upon executor: Executor, start startNextTask: @escaping(SuccessValue) throws -> NewTask) -> Task<NewTask.Value.Right>
43-
where NewTask.Value: Either, NewTask.Value.Left == Error {
41+
public func andThen<NewTask: TaskProtocol>(upon executor: Executor, start startNextTask: @escaping(SuccessValue) throws -> NewTask) -> Task<NewTask.SuccessValue> {
4442
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
45-
let progress = extendedProgress(byUnitCount: 1)
43+
let progress = preparedProgressForContinuedWork()
4644
#else
4745
let cancellationToken = Deferred<Void>()
4846
#endif
4947

50-
let future: Future<Task<NewTask.Value.Right>.Result> = andThen(upon: executor) { (result) -> Task<NewTask.Value.Right> in
48+
let future: Future = andThen(upon: executor) { (result) -> Task<NewTask.SuccessValue> in
5149
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
5250
// We want to become the thread-local progress, but we don't
5351
// want to consume units; we may not attach newTask.progress to
@@ -62,20 +60,18 @@ extension Task {
6260
// wrapper logic takes over at this point.
6361
let newTask = try startNextTask(value)
6462
#if !os(macOS) && !os(iOS) && !os(tvOS) && !os(watchOS)
65-
if let task = newTask as? Task<NewTask.Value.Right> {
66-
cancellationToken.upon(DispatchQueue.any(), execute: task.cancel)
67-
}
63+
cancellationToken.upon(DispatchQueue.any(), execute: newTask.cancel)
6864
#endif
69-
return Task<NewTask.Value.Right>(newTask)
65+
return Task<NewTask.SuccessValue>(newTask)
7066
} catch {
71-
return Task<NewTask.Value.Right>(failure: error)
67+
return Task<NewTask.SuccessValue>(failure: error)
7268
}
7369
}
7470

7571
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
76-
return Task<NewTask.Value.Right>(future: future, progress: progress)
72+
return Task<NewTask.SuccessValue>(future: future, progress: progress)
7773
#else
78-
return Task<NewTask.Value.Right>(future: future) {
74+
return Task<NewTask.SuccessValue>(future: future) {
7975
cancellationToken.fill(with: ())
8076
}
8177
#endif

Sources/Task/TaskAsync.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
// Copyright © 2015-2018 Big Nerd Ranch. Licensed under MIT.
77
//
88

9+
import Dispatch
910
#if SWIFT_PACKAGE
1011
import Deferred
1112
#endif
12-
import Dispatch
1313

1414
extension Task {
1515
/// Captures the result of asynchronously executing `work` on `queue`.

0 commit comments

Comments
 (0)