package Ġarrow . effects . type classes Ċ Ċ import Ġarrow . Kind Ċ import Ġarrow . core . Either Ċ import Ġarrow . effects . data . internal . Binding Cancellation Exception Ċ import Ġarrow . effects . type classes . sus pended . Monad De fer Syntax Ċ import Ġarrow . type classes . Monad Continuation Ċ import Ġarrow . type classes . Monad Error Continuation Ċ import Ġarrow . type classes . state Stack Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ import Ġkotlin . coroutines . Restrict s Sus pension Ċ import Ġkotlin . coroutines . intr insics . COR OUT INE _ SUS PEN DED Ċ import Ġkotlin . coroutines . intr insics . suspend Coroutine Un intercept ed Or Return Ċ import Ġkotlin . coroutines . start Coroutine Ċ Ċ type alias ĠDis posable Ġ= Ġ() Ġ-> ĠUnit Ċ Ċ @ Restrict s Sus pension Ċ @ Suppress (" DE LEG ATED _ MEMBER _ HID ES _ SUPER TYPE _ OVERRIDE ") Ċ open Ġclass ĠMonad De fer C ancellable Continuation < F , ĠA >( val ĠSC : ĠMonad De fer < F >, Ġoverride Ġval Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context ) Ġ: ĊĠ ĠMonad Error Continuation < F , ĠA >( SC ), ĠMonad De fer < F > Ġby ĠSC , ĠMonad De fer Syntax < F > Ġ{ ĊĊĠ Ġprotected Ġval Ġcancelled : ĠAtomic Boolean Ġ= ĠAtomic Boolean ( false ) ĊĊĠ Ġfun Ġdis posable (): ĠDis posable Ġ= Ġ{ Ġcancelled . set ( true ) Ġ} ĊĊĠ Ġoverride Ġfun Ġ< B > Ġbinding ( c : Ġsuspend ĠMonad Continuation < F , Ġ* >. () Ġ-> ĠB ): ĠKind < F , ĠB > Ġ= ĊĠĠĠ Ġfx ( c ) ĊĊĠ Ġoverride Ġfun Ġreturned Monad (): ĠKind < F , ĠA > Ġ= Ġreturned Monad ĊĊĠ Ġsuspend Ġfun Ġ< B > Ġbind De fer ( f : Ġ() Ġ-> ĠB ): ĠB Ġ= ĊĠĠĠ Ġdelay ( f ). bind () ĊĊĠ Ġsuspend Ġfun Ġ< B > Ġbind De fer In ( context : ĠCor outine Context , Ġf : Ġ() Ġ-> ĠB ): ĠB Ġ= ĊĠĠĠ Ġdefer Ġ{ Ġbinding Catch Ġ{ Ġbind In ( context , Ġf ) Ġ} Ġ}. bind () ĊĊĠ Ġsuspend Ġfun Ġ< B > Ġbind De fer Unsafe ( f : Ġ() Ġ-> ĠEither < Throwable , ĠB >): ĠB Ġ= ĊĠĠĠ Ġdefer Unsafe ( f ). bind () ĊĊĠ Ġoverride Ġsuspend Ġfun Ġ< B > Ġbind ( m : Ġ() Ġ-> ĠKind < F , ĠB >): ĠB Ġ= Ġsuspend Coroutine Un intercept ed Or Return Ġ{ Ġc Ġ-> ĊĠĠĠ Ġval Ġlabel Here Ġ= Ġc . state Stack Ġ// Ġsave Ġthe Ġwhole Ġcoroutine Ġstack Ġlabels ĊĠĠĠ Ġreturned Monad Ġ= Ġm (). flatMap Ġ{ Ġx : ĠB Ġ-> ĊĠĠĠĠĠ Ġc . state Stack Ġ= Ġlabel Here ĊĠĠĠĠĠ Ġif Ġ( cancelled . get ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠBinding Cancellation Exception () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġc . resume With ( Result . success ( x )) ĊĠĠĠĠĠ Ġreturned Monad ĊĠĠĠ Ġ} ĊĠĠĠ ĠCOR OUT INE _ SUS PEN DED ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġ< B > Ġbind In ( context : ĠCor outine Context , Ġm : Ġ() Ġ-> ĠB ): ĠB Ġ= Ġsuspend Coroutine Un intercept ed Or Return Ġ{ Ġc Ġ-> ĊĠĠĠ Ġval Ġlabel Here Ġ= Ġc . state Stack Ġ// Ġsave Ġthe Ġwhole Ġcoroutine Ġstack Ġlabels ĊĠĠĠ Ġval Ġmon ad Creation : Ġsuspend Ġ() Ġ-> ĠKind < F , ĠA > Ġ= Ġ{ ĊĠĠĠĠĠ Ġval Ġdatatype Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġjust ( m ()) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . raise Non Fatal < B >() ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġdatatype . flatMap Ġ{ Ġxx : ĠB Ġ-> ĊĠĠĠĠĠĠĠ Ġc . state Stack Ġ= Ġlabel Here ĊĠĠĠĠĠĠĠ Ġif Ġ( cancelled . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠBinding Cancellation Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġc . resume With ( Result . success ( xx )) ĊĠĠĠĠĠĠĠ Ġreturned Monad ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcompletion Ġ= Ġbinding In Context Continuation ( context ) ĊĠĠĠ Ġreturned Monad Ġ= Ġjust ( Unit ). flatMap Ġ{ ĊĠĠĠĠĠ Ġmon ad Creation . start Coroutine ( completion ) ĊĠĠĠĠĠ Ġval Ġerror Ġ= Ġcompletion . await () ĊĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġerror ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturned Monad ĊĠĠĠ Ġ} ĊĠĠĠ ĠCOR OUT INE _ SUS PEN DED ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġ< A > Ġfx ( f : Ġsuspend ĠMonad Continuation < F , Ġ* >. () Ġ-> ĠA ): ĠKind < F , ĠA > Ġ= ĊĠĠĠ Ġsuper < Monad De fer Syntax >. fx ( f ) ĊĊĠ Ġoverride Ġfun Ġ< A > Ġeffect ( fa : Ġsuspend Ġ() Ġ-> ĠA ): ĠKind < F , ĠA > Ġ= ĊĠĠĠ Ġsuper < Monad De fer Syntax >. effect ( fa ) Ċ Ċ } Ċ