/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . gradle . kotlin . dsl . concurrent Ċ Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . Future Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . TimeoutException Ċ Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ import Ġkotlin . coroutines . start Coroutine ĊĊ Ċ /** Ċ Ġ* ĠStarts Ġand Ġexposes Ġthe Ġgiven Ġsus pending Ġ[ computation ] Ġas Ġa Ġ[ Future ] Ġvalue . Ċ Ġ* Ċ Ġ* ĠThe Ġ[ computation ] Ġexecutes Ġsynchronous ly Ġuntil Ġits Ġfirst Ġsus pension Ġpoint . Ċ Ġ*/ Ċ @ Visible ForTesting Ċ fun Ġ< T > Ġfuture ( context : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , Ġcomputation : Ġsuspend Ġ() Ġ-> ĠT ): ĠFuture < T > Ġ= ĊĠĠĠ ĠFuture Continuation < T >( context ). also Ġ{ Ġk Ġ-> ĊĠĠĠĠĠĠĠ Ġcomputation . start Coroutine ( completion Ġ= Ġk ) ĊĠĠĠ Ġ} ĊĊ Ċ private Ċ class ĠFuture Continuation < T >( override Ġval Ġcontext : ĠCor outine Context ) Ġ: ĠFuture < T >, ĠContinu ation < T > Ġ{ ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġvar Ġresult : ĠResult < T >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġoutcome Latch Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠ Ġoverride Ġfun Ġresume With ( result : ĠResult < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . result Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġoutcome Latch . count Down () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Cancelled (): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġcancel ( may Interrupt If Running : ĠBoolean ): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġis Done (): ĠBoolean Ġ= Ġresult Ġ!= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġoutcome Latch . await () ĊĠĠĠĠĠĠĠ Ġreturn Ġget OrThrow () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( timeout : ĠLong , Ġunit : ĠTimeUnit ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( outcome Latch . await ( timeout , Ġunit )) Ġget OrThrow () ĊĠĠĠĠĠĠĠ Ġelse Ġthrow ĠTimeout Exception () ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġget OrThrow () Ġ= Ġ( result Ġas ĠResult < T >). get OrThrow () Ċ } Ċ