/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ġd kim 1 9 3 7 5 Ċ Ġ* Ċ Ġ* Ġ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 Ġme . dk im 1 9 3 7 5 . dk im core . async Ċ Ċ import Ġme . dk im 1 9 3 7 5 . dk im core . annotation . API Ċ import Ġjava . util . concurrent .* Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . resume With Exception Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ class ĠExec utors Consumer < T >( ĊĠĠĠ Ġprivate Ġval Ġexecutor : ĠExecutor Service Ġ= ĠExec utors . new Cached ThreadPool (), ĊĠĠĠ Ġtask : Ġ() Ġ-> ĠT , Ċ ) Ġ: ĠAction Consumer < T >( task ) Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġawait WithTimeout ( ĊĠĠĠĠĠĠĠ Ġtimeout : ĠLong , ĊĠĠĠĠĠĠĠ Ġunit : ĠTimeUnit , ĊĠĠĠĠĠĠĠ Ġfailure : Ġ( Continuation < T >, ĠThrowable ) Ġ-> ĠUnit , ĊĠĠĠ Ġ): ĠT Ġ= Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠ Ġexecutor . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( Future Task ( task ). get ( timeout , Ġunit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With Exception ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġawait With Safe Timeout ( ĊĠĠĠĠĠĠĠ Ġtimeout : ĠLong , ĊĠĠĠĠĠĠĠ Ġunit : ĠTimeUnit , ĊĠĠĠĠĠĠĠ Ġfailure : Ġ( Continuation < T >, ĠThrowable ) Ġ-> ĠUnit , ĊĠĠĠ Ġ): ĠT ? Ġ= Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠ Ġexecutor . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( Future Task ( task ). get ( timeout , Ġunit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġis ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ submit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With Exception ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ API ĊĠĠĠ Ġoverride Ġfun Ġqueue ( ĊĠĠĠĠĠĠĠ Ġsuccess : Ġ(( T ) Ġ-> ĠUnit ), ĊĠĠĠĠĠĠĠ Ġfailure : Ġ(( Throwable ) Ġ-> ĠUnit ), ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . queue ( success , Ġfailure ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġqueue WithTimeout ( ĊĠĠĠĠĠĠĠ Ġtimeout : ĠLong , ĊĠĠĠĠĠĠĠ Ġunit : ĠTimeUnit , ĊĠĠĠĠĠĠĠ Ġsuccess : Ġ( T ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġfailure : Ġ( Throwable ) Ġ-> ĠUnit , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠFuture Task ( task ) ĊĠĠĠĠĠĠĠ Ġexecutor . submit ( future :: run ) ĊĠĠĠĠĠĠĠ Ġexecutor . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess ( future . get ( timeout , Ġunit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailure ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġqueue With Safe Timeout ( ĊĠĠĠĠĠĠĠ Ġtimeout : ĠLong , ĊĠĠĠĠĠĠĠ Ġunit : ĠTimeUnit , ĊĠĠĠĠĠĠĠ Ġsuccess : Ġ( T ?) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġfailure : Ġ( Throwable ) Ġ-> ĠUnit , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠFuture Task ( task ) ĊĠĠĠĠĠĠĠ Ġexecutor . submit ( future :: run ) ĊĠĠĠĠĠĠĠ Ġexecutor . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess ( future . get ( timeout , Ġunit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġis ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ submit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailure ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ API ĊĠĠĠ Ġoverride Ġfun Ġsubmit (): ĠFuture < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠCompletableFuture < T >() ĊĠĠĠĠĠĠĠ Ġexecutor . submit Ġfuture @{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture . complete ( task ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture . complete Exception ally ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ future ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfuture ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcomplete WithTimeout ( ĊĠĠĠĠĠĠĠ Ġtimeout : ĠLong , ĊĠĠĠĠĠĠĠ Ġunit : ĠTimeUnit , ĊĠĠĠ Ġ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsubmit (). get ( timeout , Ġunit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcomplete With Safe Timeout ( ĊĠĠĠĠĠĠĠ Ġtimeout : ĠLong , ĊĠĠĠĠĠĠĠ Ġunit : ĠTimeUnit , ĊĠĠĠ Ġ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit (). get ( timeout , Ġunit ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }