@@ -355,7 +355,13 @@ public class Task<Progress, Value, Error>: Printable
355355 ///
356356 public func progress( progressClosure: ProgressTuple -> Void ) -> Task
357357 {
358- self . _machine. addProgressTupleHandler ( progressClosure)
358+ var token : HandlerToken ? = nil
359+ return self . progress ( & token, progressClosure)
360+ }
361+
362+ public func progress( inout token: HandlerToken ? , _ progressClosure: ProgressTuple -> Void ) -> Task
363+ {
364+ self . _machine. addProgressTupleHandler ( & token, progressClosure)
359365
360366 return self
361367 }
@@ -367,7 +373,13 @@ public class Task<Progress, Value, Error>: Printable
367373 ///
368374 public func then< Value2> ( thenClosure: ( Value ? , ErrorInfo ? ) -> Value2 ) -> Task < Progress , Value2 , Error >
369375 {
370- return self . then { ( value: Value ? , errorInfo: ErrorInfo ? ) -> Task < Progress , Value2 , Error > in
376+ var token : HandlerToken ? = nil
377+ return self . then ( & token, thenClosure)
378+ }
379+
380+ public func then< Value2> ( inout token: HandlerToken ? , _ thenClosure: ( Value ? , ErrorInfo ? ) -> Value2 ) -> Task < Progress , Value2 , Error >
381+ {
382+ return self . then ( & token) { ( value: Value ? , errorInfo: ErrorInfo ? ) -> Task < Progress , Value2 , Error > in
371383 return Task < Progress , Value2 , Error > ( value: thenClosure ( value, errorInfo) )
372384 }
373385 }
@@ -378,6 +390,12 @@ public class Task<Progress, Value, Error>: Printable
378390 /// - e.g. task.then { value, errorInfo -> NextTaskType in ... }
379391 ///
380392 public func then< Progress2, Value2> ( thenClosure: ( Value ? , ErrorInfo ? ) -> Task < Progress2 , Value2 , Error > ) -> Task < Progress2 , Value2 , Error >
393+ {
394+ var token : HandlerToken ? = nil
395+ return self . then ( & token, thenClosure)
396+ }
397+
398+ public func then< Progress2, Value2> ( inout token: HandlerToken ? , _ thenClosure: ( Value ? , ErrorInfo ? ) -> Task < Progress2 , Value2 , Error > ) -> Task < Progress2 , Value2 , Error >
381399 {
382400 return Task < Progress2 , Value2 , Error > { [ unowned self] newMachine, progress, fulfill, _reject, configure in
383401
@@ -389,8 +407,8 @@ public class Task<Progress, Value, Error>: Printable
389407 // This is especially important for ReactKit's `deinitSignal` behavior.
390408 //
391409 let selfMachine = self . _machine
392-
393- self . _then {
410+
411+ self . _then ( & token ) {
394412 let innerTask = thenClosure ( selfMachine. value, selfMachine. errorInfo)
395413 _bindInnerTask ( innerTask, newMachine, progress, fulfill, _reject, configure)
396414 }
@@ -399,13 +417,13 @@ public class Task<Progress, Value, Error>: Printable
399417 }
400418
401419 /// invokes `completionHandler` "now" or "in the future"
402- private func _then( completionHandler: Void -> Void )
420+ private func _then( inout token : HandlerToken ? , _ completionHandler: Void -> Void )
403421 {
404422 switch self . state {
405423 case . Fulfilled, . Rejected, . Cancelled:
406424 completionHandler ( )
407425 default :
408- self . _machine. addCompletionHandler ( completionHandler)
426+ self . _machine. addCompletionHandler ( & token , completionHandler)
409427 }
410428 }
411429
@@ -416,7 +434,13 @@ public class Task<Progress, Value, Error>: Printable
416434 ///
417435 public func success< Value2> ( successClosure: Value -> Value2 ) -> Task < Progress , Value2 , Error >
418436 {
419- return self . success { ( value: Value ) -> Task < Progress , Value2 , Error > in
437+ var token : HandlerToken ? = nil
438+ return self . success ( & token, successClosure)
439+ }
440+
441+ public func success< Value2> ( inout token: HandlerToken ? , _ successClosure: Value -> Value2 ) -> Task < Progress , Value2 , Error >
442+ {
443+ return self . success ( & token) { ( value: Value ) -> Task < Progress , Value2 , Error > in
420444 return Task < Progress , Value2 , Error > ( value: successClosure ( value) )
421445 }
422446 }
@@ -427,13 +451,19 @@ public class Task<Progress, Value, Error>: Printable
427451 /// - e.g. task.success { value -> NextTaskType in ... }
428452 ///
429453 public func success< Progress2, Value2> ( successClosure: Value -> Task < Progress2 , Value2 , Error > ) -> Task < Progress2 , Value2 , Error >
454+ {
455+ var token : HandlerToken ? = nil
456+ return self . success ( & token, successClosure)
457+ }
458+
459+ public func success< Progress2, Value2> ( inout token: HandlerToken ? , _ successClosure: Value -> Task < Progress2 , Value2 , Error > ) -> Task < Progress2 , Value2 , Error >
430460 {
431461 return Task < Progress2 , Value2 , Error > { [ unowned self] newMachine, progress, fulfill, _reject, configure in
432462
433463 let selfMachine = self . _machine
434464
435465 // NOTE: using `self._then()` + `selfMachine` instead of `self.then()` will reduce Task allocation
436- self . _then {
466+ self . _then ( & token ) {
437467 if let value = selfMachine. value {
438468 let innerTask = successClosure ( value)
439469 _bindInnerTask ( innerTask, newMachine, progress, fulfill, _reject, configure)
@@ -454,7 +484,13 @@ public class Task<Progress, Value, Error>: Printable
454484 ///
455485 public func failure( failureClosure: ErrorInfo -> Value ) -> Task
456486 {
457- return self . failure { ( errorInfo: ErrorInfo ) -> Task in
487+ var token : HandlerToken ? = nil
488+ return self . failure ( & token, failureClosure)
489+ }
490+
491+ public func failure( inout token: HandlerToken ? , _ failureClosure: ErrorInfo -> Value ) -> Task
492+ {
493+ return self . failure ( & token) { ( errorInfo: ErrorInfo ) -> Task in
458494 return Task ( value: failureClosure ( errorInfo) )
459495 }
460496 }
@@ -466,12 +502,18 @@ public class Task<Progress, Value, Error>: Printable
466502 /// - e.g. task.failure { error, isCancelled -> NextTaskType in ... }
467503 ///
468504 public func failure< Progress2> ( failureClosure: ErrorInfo -> Task < Progress2 , Value , Error > ) -> Task < Progress2 , Value , Error >
505+ {
506+ var token : HandlerToken ? = nil
507+ return self . failure ( & token, failureClosure)
508+ }
509+
510+ public func failure< Progress2> ( inout token: HandlerToken ? , _ failureClosure: ErrorInfo -> Task < Progress2 , Value , Error > ) -> Task < Progress2 , Value , Error >
469511 {
470512 return Task < Progress2 , Value , Error > { [ unowned self] newMachine, progress, fulfill, _reject, configure in
471513
472514 let selfMachine = self . _machine
473515
474- self . _then {
516+ self . _then ( & token ) {
475517 if let value = selfMachine. value {
476518 fulfill ( value)
477519 }
@@ -503,6 +545,20 @@ public class Task<Progress, Value, Error>: Printable
503545 {
504546 return self . _machine. handleCancel ( error: error)
505547 }
548+
549+ // MARK: Remove Handlers
550+
551+ public func removeProgress( handlerToken: HandlerToken )
552+ {
553+ return self . _machine. removeProgressTupleHandler ( handlerToken)
554+ }
555+
556+ /// NOTE: `task.removeThen(token)` will force `let task2 = task.then(&token)` to deinit immediately and tries cancellation if it is still running.
557+ public func removeThen( handlerToken: HandlerToken )
558+ {
559+ return self . _machine. removeCompletionHandler ( handlerToken)
560+ }
561+
506562}
507563
508564// MARK: - Helper
0 commit comments