Skip to content

Commit 867e165

Browse files
committed
Add on(success:failure:) for adding side-effects.
1 parent f3eb5b8 commit 867e165

File tree

2 files changed

+70
-58
lines changed

2 files changed

+70
-58
lines changed

SwiftTask/SwiftTask.swift

Lines changed: 19 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -198,20 +198,6 @@ public class Task<Progress, Value, Error>: Cancellable, CustomStringConvertible
198198
})
199199
}
200200

201-
///
202-
/// creates rejected task with ErrorInfo
203-
///
204-
/// - e.g. Task<P, V, E>(errorInfo: someErrorInfo)
205-
///
206-
internal convenience init(errorInfo: ErrorInfo)
207-
{
208-
self.init(_initClosure: { machine, progress, fulfill, _reject, configure in
209-
_reject(errorInfo)
210-
})
211-
212-
self.name = "RejectedTask"
213-
}
214-
215201
/// internal-init for accessing `machine` inside `_initClosure`
216202
/// (NOTE: _initClosure has _RejectInfoHandler as argument)
217203
internal init(weakified: Bool = false, paused: Bool = false, _initClosure: _InitClosure)
@@ -369,13 +355,13 @@ public class Task<Progress, Value, Error>: Cancellable, CustomStringConvertible
369355
///
370356
/// NOTE: `oldProgress` is always nil when `weakified = true`
371357
///
372-
public func progress(progressClosure: ProgressTuple -> Void) -> Task
358+
public func progress(progressClosure: ProgressTuple -> Void) -> Self
373359
{
374360
var dummyCanceller: Canceller? = nil
375361
return self.progress(&dummyCanceller, progressClosure)
376362
}
377363

378-
public func progress<C: Canceller>(inout canceller: C?, _ progressClosure: ProgressTuple -> Void) -> Task
364+
public func progress<C: Canceller>(inout canceller: C?, _ progressClosure: ProgressTuple -> Void) -> Self
379365
{
380366
var token: _HandlerToken? = nil
381367
self._machine.addProgressTupleHandler(&token, progressClosure)
@@ -461,26 +447,6 @@ public class Task<Progress, Value, Error>: Cancellable, CustomStringConvertible
461447
}
462448
}
463449

464-
///
465-
/// success (fulfilled) + closure returning nothing
466-
/// used as transparent (i.e. it doesn't affect passed Task) handler.
467-
///
468-
/// - e.g. task.success { value -> Void in ... }
469-
///
470-
public func success(successClosure: Value -> Void) -> Task
471-
{
472-
var dummyCanceller: Canceller? = nil
473-
return self.success(&dummyCanceller, successClosure)
474-
}
475-
476-
public func success<C: Canceller>(inout canceller: C?, _ successClosure: Value -> Void) -> Task
477-
{
478-
return self.success(&canceller) { (value: Value) -> Task in
479-
successClosure(value)
480-
return Task(value: value)
481-
}
482-
}
483-
484450
///
485451
/// success (fulfilled) + closure returning **value**
486452
///
@@ -530,28 +496,6 @@ public class Task<Progress, Value, Error>: Cancellable, CustomStringConvertible
530496
}.name("\(self.name)-success")
531497
}
532498

533-
///
534-
/// failure (rejected or cancelled) + closure returning nothing
535-
/// used as transparent (i.e. it doesn't affect passed Task) handler.
536-
///
537-
/// - e.g. task.failure { errorInfo -> Void in ... }
538-
/// - e.g. task.failure { error, isCancelled -> Void in ... }
539-
///
540-
541-
public func failure(failureClosure: ErrorInfo -> Void) -> Task
542-
{
543-
var dummyCanceller: Canceller? = nil
544-
return self.failure(&dummyCanceller, failureClosure)
545-
}
546-
547-
public func failure<C: Canceller>(inout canceller: C?, _ failureClosure: ErrorInfo -> Void) -> Task
548-
{
549-
return self.failure(&canceller) { (errorInfo: ErrorInfo) -> Task in
550-
failureClosure(errorInfo)
551-
return Task(errorInfo: errorInfo)
552-
}
553-
}
554-
555499
///
556500
/// failure (rejected or cancelled) + closure returning **value**
557501
///
@@ -602,6 +546,23 @@ public class Task<Progress, Value, Error>: Cancellable, CustomStringConvertible
602546
}.name("\(self.name)-failure")
603547
}
604548

549+
public func on(success success: Value -> Void = { _ in }, failure: ErrorInfo -> Void = { _ in }) -> Self
550+
{
551+
let selfMachine = self._machine
552+
553+
var dummyCanceller: Canceller? = nil
554+
self._then(&dummyCanceller) {
555+
if let value = selfMachine.value.rawValue {
556+
success(value)
557+
}
558+
else if let errorInfo = selfMachine.errorInfo.rawValue {
559+
failure(errorInfo)
560+
}
561+
}
562+
563+
return self
564+
}
565+
605566
public func pause() -> Bool
606567
{
607568
return self._machine.handlePause()

SwiftTaskTests/SwiftTaskTests.swift

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,57 @@ class SwiftTaskTests: _TestCase
422422
self.wait()
423423
}
424424

425+
//--------------------------------------------------
426+
// MARK: - On
427+
//--------------------------------------------------
428+
429+
func testOn_success()
430+
{
431+
let expect = self.expectationWithDescription(__FUNCTION__)
432+
433+
Task<(), String, ErrorString> { progress, fulfill, reject, configure in
434+
435+
self.perform {
436+
fulfill("OK")
437+
}
438+
439+
}.on(success: { value in
440+
441+
XCTAssertEqual(value, "OK")
442+
expect.fulfill()
443+
444+
}).on(failure: { error, isCancelled in
445+
XCTFail("Should never reach here.")
446+
})
447+
448+
self.wait()
449+
}
450+
451+
func testOn_failure()
452+
{
453+
let expect = self.expectationWithDescription(__FUNCTION__)
454+
455+
Task<(), String, ErrorString> { progress, fulfill, reject, configure in
456+
457+
self.perform {
458+
reject("NG")
459+
}
460+
461+
}.on(success: { value in
462+
463+
XCTFail("Should never reach here.")
464+
465+
}).on(failure: { error, isCancelled in
466+
467+
XCTAssertEqual(error!, "NG")
468+
XCTAssertFalse(isCancelled)
469+
expect.fulfill()
470+
471+
})
472+
473+
self.wait()
474+
}
475+
425476
//--------------------------------------------------
426477
// MARK: - Progress
427478
//--------------------------------------------------

0 commit comments

Comments
 (0)