package Ġgeneric Ċ Ċ import Ġarrow . core . Left Ċ import Ġarrow . core . Right Ċ import Ġarrow . core . comp ut ations . either Ċ import Ġio . kot lint est . fail Ċ import Ġio . kot lint est . shouldBe Ċ import Ġio . kot lint est . should Throw Ċ import Ġio . kot lint est . specs . String Spec Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . intr insics . COR OUT INE _ SUS PEN DED Ċ import Ġkotlin . coroutines . intr insics . intercept ed Ċ import Ġkotlin . coroutines . intr insics . suspend Coroutine Un intercept ed Or Return Ċ import Ġkotlin . coroutines . start Coroutine Ċ Ċ class ĠS us pending Computation Test Ġ: ĠString Spec ({ ĊĊĠ Ġ" immediate Ġvalues " Ġ{ ĊĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠ ĠRight ( 1 ). bind () ĊĠĠĠ Ġ} ĠshouldBe ĠRight ( 1 ) ĊĠ Ġ} ĊĊĠ Ġ" sus pended Ġvalue " Ġ{ ĊĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠ ĠRight ( 1 ). suspend (). bind () ĊĠĠĠ Ġ} ĠshouldBe ĠRight ( 1 ) ĊĠ Ġ} ĊĊĠ Ġ" immediate Ġshort - circuit " Ġ{ ĊĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠ ĠLeft (" hello "). bind () ĊĠĠĠ Ġ} ĠshouldBe ĠLeft (" hello ") ĊĠ Ġ} ĊĊĠ Ġ" sus pended Ġshort - circuit " Ġ{ ĊĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠ ĠLeft (" hello "). suspend (). bind () ĊĠĠĠ Ġ} ĠshouldBe ĠLeft (" hello ") ĊĠ Ġ} ĊĊĠ Ġ" Re throws Ġimmediate Ġexceptions " Ġ{ ĊĠĠĠ Ġval Ġe Ġ= ĠRuntimeException (" test ") ĊĠĠĠ Ġshould Throw < RuntimeException > Ġ{ ĊĠĠĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ ĠRight ( 1 ). bind () ĊĠĠĠĠĠĠĠ ĠRight ( 1 ). suspend (). bind () ĊĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĠshouldBe Ġe ĊĠ Ġ} ĊĊĠ Ġ" Re throws Ġsus pended Ġexceptions " Ġ{ ĊĠĠĠ Ġval Ġe Ġ= ĠRuntimeException (" test ") ĊĠĠĠ Ġshould Throw < RuntimeException > Ġ{ ĊĠĠĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ ĠRight ( 1 ). bind () ĊĠĠĠĠĠĠĠ ĠRight ( 1 ). suspend (). bind () ĊĠĠĠĠĠĠĠ Ġe . suspend () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĠshouldBe Ġe ĊĠ Ġ} ĊĊĠ Ġ" Can Ġshort - circuit Ġimmediately Ġfrom Ġnested Ġblocks " Ġ{ ĊĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠ Ġval Ġx Ġ= Ġmaybe Eff Ġ{ ĊĠĠĠĠĠĠĠ ĠLeft (" test "). bind () ĊĠĠĠĠĠĠĠĠ 5 L ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprintln ( x ) ĊĠĠĠĠĠĠ 1 ĊĠĠĠ Ġ} ĠshouldBe ĠLeft (" test ") ĊĠ Ġ} ĊĊĠ Ġ" Can Ġshort - circuit Ġsus pended Ġfrom Ġnested Ġblocks " Ġ{ ĊĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠ Ġval Ġx Ġ= Ġmaybe Eff Ġ{ ĊĠĠĠĠĠĠĠ ĠLeft (" test "). suspend (). bind () ĊĠĠĠĠĠĠĠĠ 5 L ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprintln ( x ) ĊĠĠĠĠĠĠ 1 ĊĠĠĠ Ġ} ĠshouldBe ĠLeft (" test ") ĊĠ Ġ} ĊĊĠ Ġ" Can Ġshort - circuit Ġimmediately Ġafter Ġsus pending Ġfrom Ġnested Ġblocks " Ġ{ ĊĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠ Ġval Ġx Ġ= Ġmaybe Eff Ġ{ ĊĠĠĠĠĠĠĠ ĠJust ( 1 L ). suspend (). bind () ĊĠĠĠĠĠĠĠ ĠLeft (" test "). suspend (). bind () ĊĠĠĠĠĠĠĠĠ 5 L ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprintln ( x ) ĊĠĠĠĠĠĠ 1 ĊĠĠĠ Ġ} ĠshouldBe ĠLeft (" test ") ĊĠ Ġ} ĊĊĠ Ġ" Can Ġshort - circuit Ġsus pended Ġafter Ġsus pending Ġfrom Ġnested Ġblocks " Ġ{ ĊĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠ Ġval Ġx Ġ= Ġmaybe Eff Ġ{ ĊĠĠĠĠĠĠĠ ĠJust ( 1 L ). suspend (). bind () ĊĠĠĠĠĠĠĠ ĠLeft (" test "). suspend (). bind () ĊĠĠĠĠĠĠĠĠ 5 L ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprintln ( x ) ĊĠĠĠĠĠĠ 1 ĊĠĠĠ Ġ} ĠshouldBe ĠLeft (" test ") ĊĠ Ġ} ĊĊĠ Ġ" Short - circuit ing Ġcancel s ĠKotlin X ĠCor outines " Ġ{ ĊĠĠĠ Ġval Ġscope Ġ= ĠCor outine Scope ( Dispatch ers . Default ) ĊĠĠĠ Ġval Ġl atch Ġ= ĠComp letable Deferred < Unit >() ĊĠĠĠ Ġval Ġcancelled Ġ= ĠComp letable Deferred < Unit >() ĊĊĠĠĠ Ġeither < String , ĠInt > Ġ{ ĊĠĠĠĠĠ Ġval Ġdeferred s : ĠList < Deferred < Int >> Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġscope . async Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcomplete On Cancellation ( latch , Ġcancelled ) ĊĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġscope . async < Int > Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠĠĠ ĠLeft (" hello "). bind () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġdeferred s . await All (). sum () ĊĠĠĠ Ġ} ĠshouldBe ĠLeft (" hello ") ĊĊĠĠĠ Ġcancelled . await () ĊĠ Ġ} ĊĊĠ Ġ" Computation Ġblocks Ġrun Ġon Ġparent Ġcontext " Ġ{ ĊĠĠĠ Ġval Ġparent Ctx Ġ= Ġcurrent Context () ĊĠĠĠ Ġeither < String , ĠUnit > Ġ{ ĊĠĠĠĠĠ Ġcurrent Context () ĠshouldBe Ġparent Ctx ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }) Ċ Ċ suspend Ġfun Ġcurrent Context (): ĠCor outine Context Ġ= ĊĠ Ġkotlin . coroutines . coroutine Context Ċ Ċ suspend Ġfun Ġcomplete On Cancellation ( latch : ĠComp letable Deferred < Unit >, Ġcancelled : ĠComp letable Deferred < Unit >): ĠUnit Ġ= ĊĠ Ġsuspend C ancellable Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠ Ġcont . invoke On Cancellation Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! cancelled . complete ( Unit )) Ġfail (" cancelled Ġl atch Ġwas Ġcompleted Ġtwice ") ĊĠĠĠĠĠ Ġelse ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! latch . complete ( Unit )) Ġfail (" latch Ġwas Ġcompleted Ġtwice ") ĊĠĠĠ Ġelse ĠUnit ĊĠ Ġ} Ċ Ċ internal Ġsuspend Ġfun ĠThrowable . suspend (): ĠNothing Ġ= ĊĠ Ġsuspend Coroutine Un intercept ed Or Return Ġ{ Ġcont Ġ-> ĊĠĠĠ Ġsuspend Ġ{ Ġthrow Ġthis Ġ}. start Coroutine ( ĊĠĠĠĠĠ ĠContinu ation ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcont . intercept ed (). resume With ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠCOR OUT INE _ SUS PEN DED ĊĠ Ġ} Ċ Ċ internal Ġsuspend Ġfun Ġ< A > ĠA . suspend (): ĠA Ġ= ĊĠ Ġsuspend Coroutine Un intercept ed Or Return Ġ{ Ġcont Ġ-> ĊĠĠĠ Ġsuspend Ġ{ Ġthis Ġ}. start Coroutine ( ĊĠĠĠĠĠ ĠContinu ation ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcont . intercept ed (). resume With ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠCOR OUT INE _ SUS PEN DED ĊĠ Ġ} Ċ