diff --git a/SwiftTask/SwiftTask.swift b/SwiftTask/SwiftTask.swift index 6415a1b..493e0e5 100644 --- a/SwiftTask/SwiftTask.swift +++ b/SwiftTask/SwiftTask.swift @@ -821,6 +821,56 @@ extension Task }.name("Task.some") } + private func toAnyTask() -> Task + { + return self.then{ (value, failureInfo) -> Task in + if let value = value as? AnyObject { + return Task(value: value) + } + if let error = failureInfo?.error { + return Task(error: error) + } + fatalError() + } + } + + public class func when(tasks: (Task, Task)) -> Task + { + return Task { progress, fulfill, reject, _ in + Task.all([tasks.0.toAnyTask(), tasks.1.toAnyTask()]).success { values in + guard let v1 = values[0] as? V, + let v2 = values[1] as? V2 else { + fatalError() + } + fulfill((v1, v2)) + }.failure { error, _ in + guard let error = error else { return } + reject(error) + }.progress { (oldProgress, newProgress) -> Void in + progress(newProgress) + }.name("Task.when") + } + } + + public class func when(tasks: (Task, Task, Task)) -> Task + { + return Task { progress, fulfill, reject, _ in + Task.all([tasks.0.toAnyTask(), tasks.1.toAnyTask(), tasks.2.toAnyTask()]).success { values in + guard let v1 = values[0] as? V, + let v2 = values[1] as? V2, + let v3 = values[2] as? V3 else { + fatalError() + } + fulfill((v1, v2, v3)) + }.failure { error, _ in + guard let error = error else { return } + reject(error) + }.progress { (oldProgress, newProgress) -> Void in + progress(newProgress) + }.name("Task.when") + } + } + public class func cancelAll(tasks: [Task]) { for task in tasks { diff --git a/SwiftTaskTests/SwiftTaskTests.swift b/SwiftTaskTests/SwiftTaskTests.swift index f9be681..ffd70cd 100644 --- a/SwiftTaskTests/SwiftTaskTests.swift +++ b/SwiftTaskTests/SwiftTaskTests.swift @@ -1565,4 +1565,34 @@ class SwiftTaskTests: _TestCase self.wait() } + + //-------------------------------------------------- + // MARK: - When + //-------------------------------------------------- + + func testWhen_success() { + let task1 = Task { fulfill, reject in fulfill("Success") } + let task2 = Task { fulfill, reject in fulfill(1) } + let task3 = Task { fulfill, reject in fulfill(1.1) } + + Task.when((task1, task2, task3)).success { (string, int, double) -> Void in + XCTAssertEqual(string, "Success") + XCTAssertEqual(int, 1) + XCTAssertEqual(double, 1.1) + }.failure { _ in + XCTFail() + } + } + + func testWhen_failure() { + let task1 = Task { fulfill, reject in fulfill("Success") } + let task2 = Task { fulfill, reject in fulfill(1) } + let task3 = Task { fulfill, reject in reject("Rejected") } + + Task.when((task1, task2, task3)).success { (string, int, double) -> Void in + XCTFail() + }.failure { (error, isCancelled) -> Void in + XCTAssertEqual(error, "Rejected") + } + } }