/* Ċ Ġ* ĠĠ ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠĠ ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠShop ify ĠInc . Ċ Ġ* Ċ Ġ* ĠĠ ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* ĠĠ Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* ĠĠ Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* ĠĠ Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* ĠĠ Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* ĠĠ Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠĠ ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* ĠĠ Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠĠ ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠĠ ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠĠ ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠĠ ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠĠ ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠĠ ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠĠ ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . shop ify . promises Ċ Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ /** Ċ Ġ* ĠCallback Ġto Ġbe Ġnotified Ġwhen Ġ[ Promise ] Ġresolved Ċ Ġ* Ċ Ġ* ĠProvide d Ġ[ Promise . Result ]` < T , ĠE >` Ġargument Ġrepresents Ġthe Ġresult Ġof Ġ[ Promise ]` < T , ĠE >` Ġexecution Ġand Ġit Ġcan Ġbe Ġeither Ċ Ġ* Ġ[ Promise . Result . Success ] Ġor Ġ[ Promise . Result . Error ] Ċ Ġ* Ċ Ġ* Ġ@ see ĠPromise . Result Ċ Ġ*/ Ċ type alias ĠPromise Callback < T , ĠE > Ġ= Ġ( result : ĠPromise . Result < T , ĠE >) Ġ-> ĠUnit Ċ Ċ /** Ċ Ġ* ĠCallback Ġto Ġbe Ġnotified Ġwhen Ġ[ Promise ] Ġresolved Ġwith Ġ[ Promise . Result . Success ] Ċ Ġ* Ċ Ġ* ĠProvide d Ġargument Ġrepresents Ġthe Ġsuccess Ġresult Ġof Ġ[ Promise ]` < T , ĠE >` Ġexecution Ċ Ġ*/ Ċ type alias ĠPromise On Resolve Callback < T > Ġ= Ġ( value : ĠT ) Ġ-> ĠUnit Ċ Ċ /** Ċ Ġ* ĠCallback Ġto Ġbe Ġnotified Ġwhen Ġ[ Promise ] Ġresolved Ġwith Ġ[ Promise . Result . Error ] Ċ Ġ* Ċ Ġ* ĠProvide d Ġargument Ġrepresents Ġthe Ġerror Ġresult Ġof Ġ[ Promise ]` < T , ĠE >` Ġexecution Ċ Ġ*/ Ċ type alias ĠPromise On Reject Callback < E > Ġ= Ġ( error : ĠE ) Ġ-> ĠUnit Ċ Ċ /** Ċ Ġ* ĠAction Ġto Ġbe Ġperformed Ġwhen Ġ[ Promise ] Ġhas Ġbeen Ġcanceled Ċ Ġ* Ċ Ġ* Ġ@ see ĠPromise . Subscriber . on Cancel Ċ Ġ*/ Ċ type alias ĠPromise Cancel Delegate Ġ= Ġ() Ġ-> ĠUnit Ċ Ċ /** Ċ Ġ* ĠA ĠPromise Ġtask Ġto Ġbe Ġexecuted Ċ Ġ* Ċ Ġ* ĠTask Ġis Ġresponsible Ġto Ġnotify Ġabout Ġresult Ġof Ġits Ġexecution . ĠTask Ġis Ġrepresented Ġby Ġfunction Ġwith Ġ[ Promise . Subscriber ] Ġreceiver Ġand Ċ Ġ* Ġafter Ġcompletion Ġit Ġmust Ġcall Ġeither Ġ[ Promise . Subscriber . resolve ] Ġto Ġsignal Ġsuccess Ġresult Ġor Ġ[ Promise . Subscriber . reject ] Ġin Ġcase Ġof Ċ Ġ* Ġfailure . ĠP assed Ġsubscriber Ġas Ġan Ġargument Ġfor Ġthis Ġtask Ġprovides Ġ[ Promise . Subscriber . on Cancel ] Ġfunction Ġthat Ġtask Ġcan Ġuse Ġto Ġregister Ċ Ġ* Ġany Ġaction Ġ( such Ġas Ġterminate Ġlong Ġrunning Ġjob , Ġclean Ġup Ġresources , Ġetc .) Ġto Ġbe Ġperformed Ġwhen Ġ[ Promise ] Ġhas Ġbeen Ġcanceled . Ċ Ġ* Ċ Ġ* Ġ@ see ĠPromise . Subscriber Ċ Ġ*/ Ċ type alias ĠPromise Task < T , ĠE > Ġ= ĠPromise . Subscriber < T , ĠE >. () Ġ-> ĠUnit Ċ Ċ /** Ċ Ġ* ĠFunction Ġthat Ġtransforms Ġ`( Promise . Result < T , ĠE >) Ġ-> ĠPromise < T 1 , ĠE 1 >` Ġused Ġby Ġbinding Ġoperation Ċ Ġ* Ċ Ġ* Ġ@ see ĠPromise . bind Ċ Ġ*/ Ċ type alias ĠPromise Monad Transformation < T , ĠE , ĠT 1 , ĠE 1 > Ġ= Ġ( result : ĠPromise . Result < T , ĠE >) Ġ-> ĠPromise < T 1 , ĠE 1 > Ċ Ċ /** Ċ Ġ* ĠA ĠPromise Ġthat Ġcan Ġeither Ġbe Ġresolved Ġwith Ġ[ Promise . Result . Success ]` < T , ĠE >` Ġor Ġ[ Promise . Result . Error ]` < T , ĠE >` Ċ Ġ* Ċ Ġ* ĠThe Ġresult Ġthis Ġpromise Ġresolution Ġwill Ġbe Ġdelivered Ġin Ġprovided Ġcallback Ġ[ Promise . when Complete ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠPromise . Result . Success Ċ Ġ* Ġ@ see ĠPromise . Result . Error Ċ Ġ* Ġ@ see ĠPromise . when Complete Ċ Ġ*/ Ċ class ĠPromise < T , ĠE > Ġprivate Ġconstructor ( state : ĠState < T , ĠE >) Ġ{ ĊĠ Ġprivate Ġval Ġstate : ĠAtomic Reference < State < T , ĠE >> Ġ= ĠAtomic Reference ( state ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCreate Ġa Ġnew Ġpromise Ġthat Ġexecutes Ġprovided Ġtask ĊĠĠ Ġ* ĊĠĠ Ġ* ĠTask Ġis Ġrepresented Ġby Ġa Ġfunction Ġwith Ġa Ġreceiver Ġ[ Promise . Subscriber ] Ġthat Ġmust Ġbe Ġused Ġto Ġnotify Ġabout Ġexecution Ġresult , Ġit Ġmust Ġcall ĊĠĠ Ġ* Ġeither Ġ[ Promise . Subscriber . resolve ] Ġto Ġsignal Ġsuccess Ġresult Ġor Ġ[ Promise . Subscriber . reject ] Ġin Ġcase Ġof Ġfailure . ĠAdditionally ĊĠĠ Ġ* Ġsubscriber Ġprovides Ġ[ Promise . Subscriber . on Cancel ] Ġfunction Ġthat Ġtask Ġcan Ġuse Ġto Ġregister Ġany Ġaction Ġ( such Ġas Ġterminate Ġlong Ġrunning ĊĠĠ Ġ* Ġjob , Ġclean Ġup Ġresources , Ġetc .) Ġto Ġbe Ġperformed Ġwhen Ġthis Ġ[ Promise ] Ġhas Ġbeen Ġcanceled . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠExample : ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* ĠPromise < String , ĠRuntimeException > Ġ{ ĊĠĠ Ġ* ĠĠ Ġdo On Cancel Ġ{ ĊĠĠ Ġ* ĠĠĠĠ Ġ// Ġwill Ġbe Ġcalled Ġif Ġpromise Ġhas Ġbeen Ġcanceled ĊĠĠ Ġ* ĠĠĠĠ Ġ// Ġit Ġis Ġtask Ġresponsibility Ġto Ġterminate Ġany Ġinternal Ġlong Ġrunning Ġjobs ĊĠĠ Ġ* ĠĠĠĠ Ġ// Ġand Ġclean Ġup Ġresources Ġhere ĊĠĠ Ġ* ĠĠ Ġ} ĊĠĠ Ġ* ĠĠ Ġ// Ġdo Ġsome Ġjob ĊĠĠ Ġ* ĠĠ ĠonSuccess (" Done !") ĊĠĠ Ġ* ĠĠ Ġ// ĠonError ( RuntimeException (" Failed ")) ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ*/ ĊĠ Ġconstructor ( start Delegate : ĠPromise Task < T , ĠE >) Ġ: Ġthis ( ĊĠĠĠ ĠState . Idle ( ĊĠĠĠĠĠ Ġstart Delegate Ġ= Ġstart Delegate , ĊĠĠĠĠĠ Ġcallbacks Ġ= Ġempty Set () ĊĠĠĠ Ġ) ĊĠ Ġ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠStart Ġpromise Ġtask Ġexecution ĊĠĠ Ġ* ĊĠĠ Ġ* ĠResult Ġwill Ġbe Ġdelivered Ġvia Ġ[ Promise Callback ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġcallback Ġto Ġbe Ġcalled Ġwhen Ġpromise Ġsucceed Ġor Ġfailed ĊĠĠ Ġ* Ġ@ return Ġ[ Promise ]` < T , ĠE >` ĊĠĠ Ġ* Ġ@ see ĠPromise . Result . Success ĊĠĠ Ġ* Ġ@ see ĠPromise . Result . Error ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwhen Complete ( callback : ĠPromise Callback < T , ĠE >): ĠPromise < T , ĠE > Ġ{ ĊĠĠĠ Ġappend Callback ( callback ) ĊĠĠĠ Ġif Ġ( state . get () Ġis ĠState . Idle ) Ġ{ ĊĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠStart Ġpromise Ġtask Ġexecution ĊĠĠ Ġ* ĊĠĠ Ġ* ĠResult Ġwill Ġbe Ġdelivered Ġvia Ġprovided Ġ[ Promise On Resolve Callback ] Ġor Ġ[ Promise On Reject Callback ] Ġcallbacks . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġon Resolve Ġto Ġbe Ġcalled Ġwhen Ġpromise Ġsucceed ĊĠĠ Ġ* Ġ@ param Ġon Resolve Ġto Ġbe Ġcalled Ġwhen Ġpromise Ġfailed ĊĠĠ Ġ* Ġ@ return Ġ[ Promise ]` < T , ĠE >` ĊĠĠ Ġ* Ġ@ see ĠPromise . Result . Success ĊĠĠ Ġ* Ġ@ see ĠPromise . Result . Error ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwhen Complete ( on Resolve : ĠPromise On Resolve Callback < T >, Ġon Reject : ĠPromise On Reject Callback < E >): ĠPromise < T , ĠE > Ġ{ ĊĠĠĠ Ġwhen Complete Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠPromise . Result . Success Ġ-> Ġon Resolve ( it . value ) ĊĠĠĠĠĠĠĠ Ġis ĠPromise . Result . Error Ġ-> Ġon Reject ( it . error ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSignal Ġpromise Ġto Ġcancel Ġtask Ġexecution Ġif Ġit Ġhasn 't Ġbeen Ġcompleted Ġyet ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return Ġ[ Promise ]` < T , ĠE >` ĊĠĠ Ġ* Ġ@ see ĠPromise Task ĊĠĠ Ġ* Ġ@ see ĠPromise . Subscriber . on Cancel ĊĠĠ Ġ*/ ĊĠ Ġfun Ġcancel () Ġ{ ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠ Ġval Ġold State Ġ= Ġstate . get (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠState . Cancelled ) Ġreturn Ġelse Ġit ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval ĠnewState Ġ= ĠState . Cancelled < T , ĠE >() ĊĠĠĠĠĠ Ġif Ġ( state . compare AndSet ( old State , ĠnewState )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( old State Ġas ? ĠState . InProgress )?. apply Ġ{ Ġcancel Delegate () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġwhile Ġ( true ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠBinding Ġoperation , Ġbind Ġthe Ġresult Ġof Ġthis Ġ[ Promise ] Ġand Ġreturn Ġa Ġnew Ġ[ Promise ] Ġwith Ġtransformed Ġresult ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġtransform Ġbinding Ġoperation Ġfunction Ġthat Ġtransforms Ġ`( Promise . Result < T , ĠE >) Ġ-> ĠPromise < T 1 , ĠE 1 >` ĊĠĠ Ġ* Ġ@ return Ġ[ Promise ]` T 1 , ĠE 1 ` ĊĠĠ Ġ*/ ĊĠ Ġfun Ġ< T 1 , ĠE 1 > Ġbind ( transform : ĠPromise Monad Transformation < T , ĠE , ĠT 1 , ĠE 1 >): ĠPromise < T 1 , ĠE 1 > Ġ{ ĊĠĠĠ Ġval Ġupstream Promise Ġ= Ġthis ĊĠĠĠ Ġreturn ĠPromise Ġ{ ĊĠĠĠĠĠ Ġval Ġcancel Delegate Ġ= ĠAtomic Reference < Promise Cancel Delegate > Ġ{ ĊĠĠĠĠĠĠĠ Ġupstream Promise . cancel () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġcanceled Ġ= ĠAtomic Boolean () ĊĠĠĠĠĠ Ġon Cancel Ġ{ ĊĠĠĠĠĠĠĠ Ġcanceled . set ( true ) ĊĠĠĠĠĠĠĠ Ġcancel Delegate . get (). invoke () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġsubscriber Ġ= Ġthis ĊĠĠĠĠĠ Ġupstream Promise . when Complete Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdown Stream Promise Ġ= Ġtransform ( it ) ĊĠĠĠĠĠĠĠ Ġcancel Delegate . set Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdown Stream Promise . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( c anceled . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdown Stream Promise . cancel () ĊĠĠĠĠĠĠĠĠĠ Ġreturn @ when Complete ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdown Stream Promise . when Complete Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsubscriber . dispatch ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġappend Callback ( callback : ĠPromise Callback < T , ĠE >) Ġ{ ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠ Ġval Ġold State Ġ= Ġstate . get () ĊĠĠĠĠĠ Ġval ĠnewState Ġ= Ġwhen Ġ( old State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠState . Idle , Ġis ĠState . InProgress Ġ-> Ġold State . append Callback ( callback ) ĊĠĠĠĠĠĠĠ Ġis ĠState . Complete Ġ-> Ġcallback ( old State . result ). let Ġ{ Ġold State Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġold State ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġwhile Ġ( old State Ġ!== ĠnewState Ġ&& Ġ! state . compare AndSet ( old State , ĠnewState )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġstart () Ġ{ ĊĠĠĠ Ġval Ġsubscriber Ġ= Ġobject Ġ: ĠPromise . Subscriber < T , ĠE > Ġ{ ĊĠĠĠĠĠ Ġval Ġcancel Delegate Ġ= ĠAtomic Reference < Promise Cancel Delegate >() ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġresolve ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplete ( Promise . Result . Success ( value )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġreject ( error : ĠE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplete ( Promise . Result . Error ( error )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġon Cancel ( cancel Delegate : ĠPromise Cancel Delegate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . cancel Delegate . set ( cancel Delegate ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠ Ġval Ġold State Ġ= Ġstate . get () Ġas ? ĠState . Idle Ġ?: Ġreturn ĊĠĠĠĠĠ Ġval Ġstart Delegate Ġ= Ġold State . start Delegate ĊĠĠĠĠĠ Ġval ĠnewState Ġ= ĠState . InProgress ( old State . callbacks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubscriber . cancel Delegate . get ()?. invoke () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( state . compare AndSet ( old State , ĠnewState )) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Delegate ( subscriber ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġwhile Ġ( true ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcomplete ( result : ĠPromise . Result < T , ĠE >) Ġ{ ĊĠĠĠ Ġval Ġold State Ġ= Ġstate . get ()?. let Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠState . Idle Ġ-> Ġthrow ĠIllegalStateException (" Cannot Ġmark Ġan Ġidle Ġpromise Ġas Ġcompleted .") ĊĠĠĠĠĠĠĠ Ġis ĠState . InProgress Ġ-> Ġit ĊĠĠĠĠĠĠĠ Ġis ĠState . Complete Ġ-> Ġthrow ĠIllegalStateException (" Cannot Ġcomplete Ġa Ġpromise Ġtwice .") ĊĠĠĠĠĠĠĠ Ġis ĠState . Cancelled Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ?: Ġreturn ĊĊĠĠĠ Ġval ĠnewState Ġ= ĠState . Complete ( result ) ĊĠĠĠ Ġif Ġ( state . compare AndSet ( old State , ĠnewState )) Ġ{ ĊĠĠĠĠĠ Ġold State . callbacks . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġit ( newState . result ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġsealed Ġclass ĠState < T , ĠE > Ġ{ ĊĠĠĠ Ġdata Ġclass ĠId le < T , ĠE >( ĊĠĠĠĠĠ Ġval Ġstart Delegate : ĠPromise Task < T , ĠE >, ĊĠĠĠĠĠ Ġval Ġcallbacks : ĠSet < Promise Callback < T , ĠE >> ĊĠĠĠ Ġ) Ġ: ĠState < T , ĠE >() ĊĊĠĠĠ Ġdata Ġclass ĠIn Progress < T , ĠE >( ĊĠĠĠĠĠ Ġval Ġcallbacks : ĠSet < Promise Callback < T , ĠE >>, ĊĠĠĠĠĠ Ġval Ġcancel Delegate : ĠPromise Cancel Delegate ĊĠĠĠ Ġ) Ġ: ĠState < T , ĠE >() ĊĊĠĠĠ Ġdata Ġclass ĠComplete < T , ĠE >( val Ġresult : ĠPromise . Result < T , ĠE >) Ġ: ĠState < T , ĠE >() ĊĊĠĠĠ Ġclass ĠCancel led < T , ĠE > Ġ: ĠState < T , ĠE >() ĊĊĠĠĠ Ġfun Ġappend Callback ( callback : ĠPromise Callback < T , ĠE >): ĠState < T , ĠE > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠId le Ġ-> ĠId le ( ĊĠĠĠĠĠĠĠ Ġstart Delegate Ġ= Ġstart Delegate , ĊĠĠĠĠĠĠĠ Ġcallbacks Ġ= Ġcallbacks Ġ+ Ġcallback ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġis ĠIn Progress Ġ-> ĠIn Progress ( ĊĠĠĠĠĠĠĠ Ġcancel Delegate Ġ= Ġcancel Delegate , ĊĠĠĠĠĠĠĠ Ġcallbacks Ġ= Ġcallbacks Ġ+ Ġcallback ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSubscriber Ġto Ġbe Ġpassed Ġas Ġan Ġargument Ġto Ġpromise Ġtask Ġfunction Ġ[ Promise Task ] ĊĠĠ Ġ* ĊĠĠ Ġ* ĠUsed Ġby Ġtask Ġto Ġnotify Ġabout Ġits Ġexecution Ġresult . ĊĠĠ Ġ*/ ĊĠ Ġinterface ĠSubscriber < T , ĠE > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġpromise Ġtask Ġexecution Ġfinished Ġwith Ġsuccess Ġresult ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġsuccess Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġresolve ( value : ĠT ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġpromise Ġtask Ġexecution Ġfinished Ġwith Ġfailure Ġresult ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġerror Ġfailure Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreject ( error : ĠE ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġaction Ġto Ġbe Ġpref or med Ġwhen Ġpromise Ġhas Ġbeen Ġcanceled ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcancel Delegate Ġaction Ġto Ġbe Ġinvoked ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Cancel ( cancel Delegate : ĠPromise Cancel Delegate ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠResult Ġof Ġpromise Ġtask Ġexecution ĊĠĠ Ġ*/ ĊĠ Ġsealed Ġclass ĠResult < T , ĠE > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSuccess Ġresult Ġof Ġpromise Ġtask Ġexecution ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ property Ġvalue Ġsuccess Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠSuccess < T , ĠE >( val Ġvalue : ĠT ) Ġ: ĠPromise . Result < T , ĠE >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFailure Ġresult Ġof Ġpromise Ġtask Ġexecution ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġerror Ġerror Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠError < T , ĠE >( val Ġerror : ĠE ) Ġ: ĠPromise . Result < T , ĠE >() ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrap Ġvalue Ġinto Ġsuccessfully Ġresolved Ġpromise ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġto Ġbe Ġwrapped ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Promise ]` < T , ĠNothing >` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġof ( value : ĠT ): ĠPromise < T , ĠNothing > Ġ= ĠPromise ( State . Complete ( Promise . Result . Success ( value ))) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrap Ġvalue Ġinto Ġsuccessfully Ġresolved Ġpromise Ġwith Ġspecified Ġtype Ġof Ġerror ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġto Ġbe Ġwrapped ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Promise ]` < T , ĠE >` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T , ĠE > Ġof Success ( value : ĠT ): ĠPromise < T , ĠE > Ġ= ĠPromise ( State . Complete ( Promise . Result . Success ( value ))) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrap Ġerror Ġinto Ġfailure Ġpromise ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġerror Ġto Ġbe Ġwrapped ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Promise ]` < T , ĠE >` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T , ĠE > Ġof Error ( error : ĠE ): ĠPromise < T , ĠE > Ġ= ĠPromise ( State . Complete ( Promise . Result . Error ( error ))) ĊĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġ< T , ĠE > ĠPromise . Subscriber < T , ĠE >. dispatch ( result : ĠPromise . Result < T , ĠE >) Ġ{ ĊĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠ Ġis ĠPromise . Result . Success Ġ-> Ġthis . resolve ( result . value ) ĊĠĠĠ Ġis ĠPromise . Result . Error Ġ-> Ġthis . reject ( result . error ) ĊĠ Ġ} Ċ }