/* Ċ Ġ* ĠĠ Ġ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 . Ċ Ġ*/ Ċ @ file : Jvm Name (" Promise Combine ") Ċ Ċ package Ġcom . shop ify . promises Ċ Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ /** Ċ Ġ* ĠCreate Ġ[ Promise ]` Array < T >, ĠE ` Ġthat Ġwill Ġwait Ġuntil Ġall Ġprovided Ġpromises Ġare Ġsuccessfully Ġresolved Ġor Ġone Ġof Ġthem Ġfails Ċ Ġ* Ċ Ġ* ĠIf Ġone Ġof Ġprovided Ġpromises Ġfailed Ġremaining Ġpromises Ġwill Ġbe Ġterminated Ġand Ġthis Ġ[ Promise ] Ġwill Ġfail Ġtoo Ġwith Ġthe Ġsame Ġerror . Ċ Ġ* ĠExecution Ġresults Ġare Ġkept Ġin Ġorder . Ċ Ġ* Ċ Ġ* Ġ@ param Ġpromises Ġsequence Ġof Ġ[ Promise ]` < T , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ return Ġ[ Promise ]` < Array < T >, ĠE >` Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT , ĠE > ĠPromise . Companion . all ( promises : ĠList < Promise < T , ĠE >> ): ĠPromise < Array < T >, ĠE > Ġ{ ĊĠ Ġreturn ĠPromise Ġ{ ĊĠĠĠ Ġif Ġ( promises . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġresolve ( empty Array < T >()) ĊĠĠĠĠĠ Ġreturn @ Promise ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġsubscriber Ġ= Ġthis ĊĊĠĠĠ Ġval Ġremaining Count Ġ= ĠAtomicInteger ( promises . size ) ĊĠĠĠ Ġval Ġcanceled Ġ= ĠAtomic Boolean () ĊĠĠĠ Ġval Ġcancel Ġ= Ġ{ ĊĠĠĠĠĠ Ġcanceled . set ( true ) ĊĠĠĠĠĠ Ġpromises . forEach Ġ{ Ġit . cancel () Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġon Cancel ( cancel ) ĊĊĠĠĠ Ġval Ġresult Ġ= ĠArray < Any >( promises . size ) Ġ{ ĠUnit Ġ} ĊĠĠĠ Ġpromises . forEach Indexed Ġ{ Ġindex , Ġpromise Ġ-> ĊĠĠĠĠĠ Ġif Ġ( c anceled . get ()) Ġreturn @ forEach Indexed ĊĠĠĠĠĠ Ġpromise . when Complete ( ĊĠĠĠĠĠĠĠ Ġon Resolve Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresult [ index ] Ġ= Ġit Ġas ĠAny ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( remaining Count . decrement AndGet () Ġ== Ġ 0 Ġ&& Ġ! c anceled . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . resolve ( Array ( result . size ) Ġ{ Ġresult [ it ] Ġas ĠT Ġ}) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġon Reject Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠ Ġsubscriber . reject ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġ[ Promise ]` Array < T >, ĠE ` Ġthat Ġwill Ġwait Ġuntil Ġall Ġprovided Ġpromises Ġare Ġsuccessfully Ġresolved Ġor Ġone Ġof Ġthem Ġfails Ċ Ġ* Ċ Ġ* ĠIf Ġone Ġof Ġprovided Ġpromises Ġfailed Ġremaining Ġpromises Ġwill Ġbe Ġterminated Ġand Ġthis Ġ[ Promise ] Ġwill Ġfail Ġtoo Ġwith Ġthe Ġsame Ġerror . Ċ Ġ* ĠExecution Ġresults Ġare Ġkept Ġin Ġorder . Ċ Ġ* Ċ Ġ* Ġ@ param Ġpromises Ġarray Ġof Ġ[ Promise ]` < T , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ return Ġ[ Promise ]` < Array < T >, ĠE >` Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT , ĠE > ĠPromise . Companion . all ( var arg Ġpromises : ĠPromise < T , ĠE >): ĠPromise < Array < T >, ĠE > Ġ{ ĊĠ Ġreturn Ġall ( promises . asList ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġ[ Promise ]` < Tuple < T 1 , ĠT 2 >, ĠE >` Ġthat Ġwill Ġwait Ġuntil Ġall Ġprovided Ġpromises Ġare Ġsuccess Ġresolved Ġor Ġone Ġof Ġthem Ġfails Ċ Ġ* Ċ Ġ* ĠIf Ġone Ġof Ġprovided Ġpromises Ġfailed Ġremaining Ġpromises Ġwill Ġbe Ġterminated Ġand Ġthis Ġ[ Promise ] Ġwill Ġfail Ġtoo Ġwith Ġthe Ġsame Ġerror . Ċ Ġ* Ċ Ġ* Ġ@ param Ġp 1 Ġ[ Promise ]` < T 1 , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ param Ġp 2 Ġ[ Promise ]` < T 2 , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ return Ġ[ Promise ]` < Tuple < T 1 , ĠT 2 >, ĠE >` Ċ Ġ* Ċ Ġ* Ġ@ see ĠTuple Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ", Ġ" NAME _ SH ADO WING ") Ċ fun Ġ< T 1 Ġ: ĠAny ?, ĠT 2 Ġ: ĠAny ?, ĠE > ĠPromise . Companion . all ( p 1 : ĠPromise < out ĠT 1 , Ġout ĠE >, Ġp 2 : ĠPromise < out ĠT 2 , Ġout ĠE >): ĠPromise < Tuple < T 1 , ĠT 2 >, Ġout ĠE > Ġ{ ĊĠ Ġval Ġp 1 Ġ= Ġp 1 . map Ġ{ Ġit Ġas ĠAny ? Ġ} ĊĠ Ġval Ġp 2 Ġ= Ġp 2 . map Ġ{ Ġit Ġas ĠAny ? Ġ} ĊĠ Ġreturn Ġall ( p 1 , Ġp 2 ). map Ġ{ ĊĠĠĠ ĠTuple ( it [ 0 ] Ġas ĠT 1 , Ġit [ 1 ] Ġas ĠT 2 ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġ[ Promise ]` < Tuple 3 < T 1 , ĠT 2 , ĠT 3 >, ĠE >` Ġthat Ġwill Ġwait Ġuntil Ġall Ġprovided Ġpromises Ġare Ġsuccess Ġresolved Ġor Ġone Ġof Ġthem Ġfails Ċ Ġ* Ċ Ġ* ĠIf Ġone Ġof Ġprovided Ġpromises Ġfailed Ġremaining Ġpromises Ġwill Ġbe Ġterminated Ġand Ġthis Ġ[ Promise ] Ġwill Ġfail Ġtoo Ġwith Ġthe Ġsame Ġerror . Ċ Ġ* Ċ Ġ* Ġ@ param Ġp 1 Ġ[ Promise ]` < T 1 , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ param Ġp 2 Ġ[ Promise ]` < T 2 , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ param Ġp 3 Ġ[ Promise ]` < T 3 , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ return Ġ[ Promise ]` < Tuple 3 < T 1 , ĠT 2 , ĠT 3 >, ĠE >` Ċ Ġ* Ċ Ġ* Ġ@ see ĠTuple 3 Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ", Ġ" NAME _ SH ADO WING ") Ċ fun Ġ< T 1 Ġ: ĠAny ?, ĠT 2 Ġ: ĠAny ?, ĠT 3 Ġ: ĠAny ?, ĠE > ĠPromise . Companion . all ( p 1 : ĠPromise < T 1 , ĠE >, Ġp 2 : ĠPromise < T 2 , ĠE >, Ġp 3 : ĠPromise < T 3 , ĠE >): ĠPromise < Tuple 3 < T 1 , ĠT 2 , ĠT 3 >, ĠE > Ġ{ ĊĠ Ġval Ġp 1 Ġ= Ġp 1 . map Ġ{ Ġit Ġas ĠAny ? Ġ} ĊĠ Ġval Ġp 2 Ġ= Ġp 2 . map Ġ{ Ġit Ġas ĠAny ? Ġ} ĊĠ Ġval Ġp 3 Ġ= Ġp 3 . map Ġ{ Ġit Ġas ĠAny ? Ġ} ĊĠ Ġreturn Ġall ( p 1 , Ġp 2 , Ġp 3 ). map Ġ{ ĊĠĠĠ ĠTuple 3 ( it [ 0 ] Ġas ĠT 1 , Ġit [ 1 ] Ġas ĠT 2 , Ġit [ 2 ] Ġas ĠT 3 ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġ[ Promise ]` < Tuple 4 < T 1 , ĠT 2 , ĠT 3 , ĠT 4 >, ĠE >` Ġthat Ġwill Ġwait Ġuntil Ġall Ġprovided Ġpromises Ġare Ġsuccess Ġresolved Ġor Ġone Ġof Ġthem Ġfails Ċ Ġ* Ċ Ġ* ĠIf Ġone Ġof Ġprovided Ġpromises Ġfailed Ġremaining Ġpromises Ġwill Ġbe Ġterminated Ġand Ġthis Ġ[ Promise ] Ġwill Ġfail Ġtoo Ġwith Ġthe Ġsame Ġerror . Ċ Ġ* Ċ Ġ* Ġ@ param Ġp 1 Ġ[ Promise ]` < T 1 , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ param Ġp 2 Ġ[ Promise ]` < T 2 , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ param Ġp 3 Ġ[ Promise ]` < T 3 , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ param Ġp 4 Ġ[ Promise ]` < T 4 , ĠE >` Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ return Ġ[ Promise ]` < Tuple 4 < T 1 , ĠT 2 , ĠT 3 , ĠT 4 >, ĠE >` Ċ Ġ* Ċ Ġ* Ġ@ see ĠTuple 4 Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ", Ġ" NAME _ SH ADO WING ") Ċ fun Ġ< T 1 Ġ: ĠAny ?, ĠT 2 Ġ: ĠAny ?, ĠT 3 Ġ: ĠAny ?, ĠT 4 Ġ: ĠAny ?, ĠE > ĠPromise . Companion . all ( p 1 : ĠPromise < T 1 , ĠE >, Ġp 2 : ĠPromise < T 2 , ĠE >, Ġp 3 : ĠPromise < T 3 , ĠE >, Ġp 4 : ĠPromise < T 4 , ĠE >): ĠPromise < Tuple 4 < T 1 , ĠT 2 , ĠT 3 , ĠT 4 >, ĠE > Ġ{ ĊĠ Ġval Ġp 1 Ġ= Ġp 1 . map Ġ{ Ġit Ġas ĠAny ? Ġ} ĊĠ Ġval Ġp 2 Ġ= Ġp 2 . map Ġ{ Ġit Ġas ĠAny ? Ġ} ĊĠ Ġval Ġp 3 Ġ= Ġp 3 . map Ġ{ Ġit Ġas ĠAny ? Ġ} ĊĠ Ġval Ġp 4 Ġ= Ġp 4 . map Ġ{ Ġit Ġas ĠAny ? Ġ} ĊĠ Ġreturn Ġall ( p 1 , Ġp 2 , Ġp 3 , Ġp 4 ). map Ġ{ ĊĠĠĠ ĠTuple 4 ( it [ 0 ] Ġas ĠT 1 , Ġit [ 1 ] Ġas ĠT 2 , Ġit [ 2 ] Ġas ĠT 3 , Ġit [ 3 ] Ġas ĠT 4 ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġ[ Promise ] Ġthat Ġwill Ġbe Ġresolved Ġas Ġsoon Ġas Ġthe Ġfirst Ġof Ġthe Ġprovided Ġpromises Ġresolved Ċ Ġ* Ċ Ġ* ĠIf Ġresolved Ġ[ Promise ] Ġresolved Ġwith Ġerror Ġthis Ġone Ġwill Ġfail Ġwith Ġthe Ġsame Ġerror . Ċ Ġ* Ċ Ġ* Ġ@ param Ġpromises Ġsequence Ġof Ġ[ Promise ]` < T , ĠE >` Ġto Ġbe Ġresolved Ċ Ġ* Ġ@ return Ġ[ Promise ]` < T , ĠE >` Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT , ĠE > ĠPromise . Companion . any ( promises : ĠList < Promise < T , ĠE >> ): ĠPromise < T , ĠE > Ġ{ ĊĠ Ġreturn ĠPromise Ġ{ ĊĠĠĠ Ġval Ġsubscriber Ġ= Ġthis ĊĠĠĠ Ġval Ġpromise List Ġ= Ġpromises . toList () ĊĠĠĠ Ġval Ġcanceled Ġ= ĠAtomic Boolean () ĊĠĠĠ Ġval Ġcancel Ġ= Ġ{ ĊĠĠĠĠĠ Ġcanceled . set ( true ) ĊĠĠĠĠĠ Ġpromise List . forEach Ġ{ Ġit . cancel () Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġon Cancel ( cancel ) ĊĊĠĠĠ Ġpromise List . forEach Ġ{ ĊĠĠĠĠĠ Ġif Ġ( c anceled . get ()) Ġreturn @ forEach ĊĠĠĠĠĠ Ġit . when Complete Ġ{ ĊĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠPromise . Result . Success Ġ-> Ġsubscriber . resolve ( it . value ) ĊĠĠĠĠĠĠĠĠĠ Ġis ĠPromise . Result . Error Ġ-> Ġsubscriber . reject ( it . error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġ[ Promise ] Ġthat Ġwill Ġbe Ġresolved Ġas Ġsoon Ġas Ġthe Ġfirst Ġof Ġthe Ġprovided Ġpromises Ġresolved Ċ Ġ* Ċ Ġ* ĠIf Ġresolved Ġ[ Promise ] Ġresolved Ġwith Ġerror Ġthis Ġone Ġwill Ġfail Ġwith Ġthe Ġsame Ġerror . Ċ Ġ* Ċ Ġ* Ġ@ param Ġpromises Ġvar arg Ġof Ġ[ Promise ]` < T , ĠE >` Ġto Ġbe Ġresolved Ċ Ġ* Ġ@ return Ġ[ Promise ]` < T , ĠE >` Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT , ĠE > ĠPromise . Companion . any ( var arg Ġpromises : ĠPromise < T , ĠE >): ĠPromise < T , ĠE > Ġ{ ĊĠ Ġreturn Ġany ( promises . asList ()) Ċ }