package Ġarrow Ċ Ċ import Ġarrow . core . Either Ċ import Ġarrow . core . I or Ċ import Ġarrow . core . Non Fatal Ċ import Ġarrow . core . None Ċ import Ġarrow . core . Option Ċ import Ġarrow . core . Some Ċ import Ġarrow . core . Validated Ċ import Ġarrow . core . identity Ċ import Ġarrow . core . non Fatal OrThrow Ċ import Ġarrow . internal . Empty Value Ċ import Ġkotlin . contracts . Experimental Contracts Ċ import Ġkotlin . contracts . contract Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ import Ġkotlin . coroutines . c ancellation . Cancellation Exception Ċ import Ġkotlin . coroutines . intr insics . COR OUT INE _ SUS PEN DED Ċ import Ġkotlin . coroutines . intr insics . start Coroutine Un intercept ed Or Return Ċ import Ġkotlin . coroutines . intr insics . suspend Coroutine Un intercept ed Or Return Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . jvm . Jvm Inline Ċ Ċ /** Ċ Ġ* ĠDSL Ġfor Ġconstructing ĠCont < R , ĠA > Ġvalues Ċ Ġ* Ċ Ġ* Ġ<! --- ĠTEST _ NAME ĠCont Test Ġ--> Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġsuspend Ġfun Ġtest () Ġ{ Ċ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġx Ġ= ĠEither . Right ( 1 ). bind () Ċ Ġ* ĠĠĠĠ Ġval Ġy Ġ= ĠValid ated . Valid ( 2 ). bind () Ċ Ġ* ĠĠĠĠ Ġval Ġz Ġ= ĠOption ( 3 ). bind Ġ{ Ġ" Option Ġwas Ġempty " Ġ} Ċ Ġ* ĠĠĠĠ Ġx Ġ+ Ġy Ġ+ Ġz Ċ Ġ* ĠĠ Ġ}. fold ({ Ġfail (" Shift Ġcan Ġnever Ġbe Ġthe Ġresult ") Ġ}, Ġ{ Ġit ĠshouldBe Ġ 6 Ġ}) Ċ Ġ* Ċ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġx Ġ= ĠEither . Right ( 1 ). bind () Ċ Ġ* ĠĠĠĠ Ġval Ġy Ġ= ĠValid ated . Valid ( 2 ). bind () Ċ Ġ* ĠĠĠĠ Ġval Ġz : ĠInt Ġ= ĠNone . bind Ġ{ Ġ" Option Ġwas Ġempty " Ġ} Ċ Ġ* ĠĠĠĠ Ġx Ġ+ Ġy Ġ+ Ġz Ċ Ġ* ĠĠ Ġ}. fold ({ Ġit ĠshouldBe Ġ" Option Ġwas Ġempty " Ġ}, Ġ{ Ġfail (" Int Ġcan Ġnever Ġbe Ġthe Ġresult ") Ġ}) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 0 1 . kt Ġ--> Ċ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> Ċ Ġ*/ Ċ public Ġfun Ġ< R , ĠA > Ġcont ( f : Ġsuspend ĠCont Effect < R >. () Ġ-> ĠA ): ĠCont < R , ĠA > Ġ= ĠCont Impl ( f ) Ċ Ċ /** Ċ Ġ* Ġ[ Cont ] Ġrepresents Ġa Ġsus pending Ġcomputation Ġthat Ġruns Ġwill Ġeither Ċ Ġ* Ġ- ĠComplete Ġwith Ġa Ġvalue Ġof Ġ[ A ]. Ċ Ġ* Ġ- ĠShort - circuit Ġwith Ġa Ġvalue Ġof Ġ[ R ]. Ċ Ġ* Ċ Ġ* ĠSo Ġ[ Cont ] Ġis Ġdefined Ġby Ġ[ fold ], Ġto Ġmap Ġboth Ġvalues Ġof Ġ[ R ] Ġand Ġ[ A ] Ġto Ġa Ġvalue Ġof Ġ` B `. Ċ Ġ*/ Ċ public Ġinterface ĠCont < R , ĠA > Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠRuns Ġthe Ġsus pending Ġcomputation Ġby Ġcreating Ġa Ġ[ Continuation ], Ġand Ġrunning Ġthe Ġ` fold ` Ġfunction ĊĠĠ Ġ* Ġover Ġthe Ġcomputation . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠWhen Ġthe Ġ[ Cont ] Ġhas Ġshifted Ġwith Ġ[ R ] Ġit Ġwill Ġ[ recover ] Ġthe Ġshifted Ġvalue Ġto Ġ[ B ], Ġand Ġwhen Ġit ĊĠĠ Ġ* Ġran Ġthe Ġcomputation Ġto Ġcompletion Ġit Ġwill Ġ[ transform ] Ġthe Ġvalue Ġ[ A ] Ġto Ġ[ B ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` kotlin ĊĠĠ Ġ* Ġsuspend Ġfun Ġtest () Ġ{ ĊĠĠ Ġ* ĠĠ Ġval Ġshift Ġ= Ġcont < String , ĠInt > Ġ{ ĊĠĠ Ġ* ĠĠĠĠ Ġshift (" Hello , ĠWorld !") ĊĠĠ Ġ* ĠĠ Ġ}. fold ({ Ġstr : ĠString Ġ-> Ġstr Ġ}, Ġ{ Ġint Ġ-> Ġint . toString () Ġ}) ĊĠĠ Ġ* ĠĠ Ġshift ĠshouldBe Ġ" Hello , ĠWorld !" ĊĠĠ Ġ* ĊĠĠ Ġ* ĠĠ Ġval Ġres Ġ= Ġcont < String , ĠInt > Ġ{ ĊĠĠ Ġ* ĠĠĠĠĠ 1 0 0 0 ĊĠĠ Ġ* ĠĠ Ġ}. fold ({ Ġstr : ĠString Ġ-> Ġstr . length Ġ}, Ġ{ Ġint Ġ-> Ġint Ġ}) ĊĠĠ Ġ* ĠĠ Ġres ĠshouldBe Ġ 1 0 0 0 ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 0 2 . kt Ġ--> ĊĠĠ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġ< B > Ġfold ( ĊĠĠĠ Ġrecover : Ġsuspend Ġ( shift ed : ĠR ) Ġ-> ĠB , ĊĠĠĠ Ġtransform : Ġsuspend Ġ( value : ĠA ) Ġ-> ĠB ĊĠ Ġ): ĠB ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠLike Ġ` fold ` Ġbut Ġalso Ġallows Ġfold ing Ġover Ġany Ġunexpected Ġ[ Throwable ] Ġthat Ġmight Ġhave Ġoccurred . ĊĠĠ Ġ* Ġ@ see Ġfold ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġ< B > Ġfold ( ĊĠĠĠ Ġerror : Ġsuspend Ġ( error : ĠThrowable ) Ġ-> ĠB , ĊĠĠĠ Ġrecover : Ġsuspend Ġ( shift ed : ĠR ) Ġ-> ĠB , ĊĠĠĠ Ġtransform : Ġsuspend Ġ( value : ĠA ) Ġ-> ĠB ĊĠ Ġ): ĠB Ġ= ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġfold ( recover , Ġtransform ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġerror ( e . non Fatal OrThrow ()) ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ fold ] Ġthe Ġ[ Cont ] Ġinto Ġan Ġ[ Either ]. ĠWhere Ġthe Ġshifted Ġvalue Ġ[ R ] Ġis Ġmapped Ġto Ġ[ Either . Left ], Ġand ĊĠĠ Ġ* Ġresult Ġvalue Ġ[ A ] Ġis Ġmapped Ġto Ġ[ Either . Right ]. ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġto Either (): ĠEither < R , ĠA > Ġ= Ġfold ({ ĠEither . Left ( it ) Ġ}) Ġ{ ĠEither . Right ( it ) Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ fold ] Ġthe Ġ[ Cont ] Ġinto Ġan Ġ[ I or ]. ĠWhere Ġthe Ġshifted Ġvalue Ġ[ R ] Ġis Ġmapped Ġto Ġ[ I or . Left ], Ġand ĊĠĠ Ġ* Ġresult Ġvalue Ġ[ A ] Ġis Ġmapped Ġto Ġ[ I or . Right ]. ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġto I or (): ĠI or < R , ĠA > Ġ= Ġfold ({ ĠI or . Left ( it ) Ġ}) Ġ{ ĠI or . Right ( it ) Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ fold ] Ġthe Ġ[ Cont ] Ġinto Ġan Ġ[ Validated ]. ĠWhere Ġthe Ġshifted Ġvalue Ġ[ R ] Ġis Ġmapped Ġto ĊĠĠ Ġ* Ġ[ Validated . Invalid ], Ġand Ġresult Ġvalue Ġ[ A ] Ġis Ġmapped Ġto Ġ[ Validated . Valid ]. ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġto Validated (): ĠValid ated < R , ĠA > Ġ= ĊĠĠĠ Ġfold ({ ĠValid ated . Invalid ( it ) Ġ}) Ġ{ ĠValid ated . Valid ( it ) Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ fold ] Ġthe Ġ[ Cont ] Ġinto Ġan Ġ[ Result ]. ĠWhere Ġthe Ġshifted Ġvalue Ġ[ R ] Ġis Ġmapped Ġto Ġ[ Result ] Ġby Ġthe ĊĠĠ Ġ* Ġprovided Ġfunction Ġ[ orElse ], Ġand Ġresult Ġvalue Ġ[ A ] Ġis Ġmapped Ġto Ġ[ Result . success ]. ĊĠĠ Ġ*/ ĊĠ Ġ// Ġ Ġpublic Ġsuspend Ġfun Ġto Result ( orElse : Ġsuspend Ġ( R ) Ġ-> ĠResult < A >): ĠResult < A > Ġ= ĊĠ Ġ// ĠĠĠ Ġfold ( orElse ) Ġ{ Ġa Ġ-> ĠResult . success ( a ) Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ fold ] Ġthe Ġ[ Cont ] Ġinto Ġan Ġ[ Option ]. ĠWhere Ġthe Ġshifted Ġvalue Ġ[ R ] Ġis Ġmapped Ġto Ġ[ Option ] Ġby Ġthe ĊĠĠ Ġ* Ġprovided Ġfunction Ġ[ orElse ], Ġand Ġresult Ġvalue Ġ[ A ] Ġis Ġmapped Ġto Ġ[ Some ]. ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġto Option ( orElse : Ġsuspend Ġ( R ) Ġ-> ĠOption < A >): ĠOption < A > Ġ= Ġfold ( orElse , Ġ:: Some ) ĊĊĠ Ġ/** ĠRuns Ġthe Ġ[ Cont ] Ġand Ġcaptures Ġany Ġ[ Non Fatal ] Ġexception Ġinto Ġ[ Result ]. Ġ*/ ĊĠ Ġpublic Ġfun Ġattempt (): ĠCont < R , ĠResult < A >> Ġ= Ġcont Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ ĠResult . success ( bind ()) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ ĠResult . failure ( e . non Fatal OrThrow ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġhandle Error ( recover : Ġsuspend Ġ( R ) Ġ-> ĠA ): ĠCont < Nothing , ĠA > Ġ= Ġcont Ġ{ ĊĠĠĠ Ġfold ( recover , Ġ:: identity ) ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġ< R 2 > Ġhandle Error With ( recover : Ġsuspend Ġ( R ) Ġ-> ĠCont < R 2 , ĠA >): ĠCont < R 2 , ĠA > Ġ= Ġcont Ġ{ ĊĠĠĠ Ġfold ({ Ġrecover ( it ). bind () Ġ}, Ġ:: identity ) ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġ< B > Ġrede em ( recover : Ġsuspend Ġ( R ) Ġ-> ĠB , Ġtransform : Ġsuspend Ġ( A ) Ġ-> ĠB ): ĠCont < Nothing , ĠB > Ġ= ĊĠĠĠĠĠ Ġcont Ġ{ ĊĠĠĠ Ġfold ( recover , Ġtransform ) ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġ< R 2 , ĠB > Ġrede em With ( ĊĠĠĠ Ġrecover : Ġsuspend Ġ( R ) Ġ-> ĠCont < R 2 , ĠB >, ĊĠĠĠ Ġtransform : Ġsuspend Ġ( A ) Ġ-> ĠCont < R 2 , ĠB > ĊĠ Ġ): ĠCont < R 2 , ĠB > Ġ= Ġcont Ġ{ Ġfold ( recover , Ġtransform ). bind () Ġ} Ċ } Ċ Ċ /** ĠContext Ġof Ġthe Ġ[ Cont ] ĠDSL . Ġ*/ Ċ public Ġinterface ĠCont Effect < R > Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠShort - circuit Ġthe Ġ[ Cont ] Ġcomputation Ġwith Ġvalue Ġ[ R ]. ĊĠĠ Ġ* Ġ``` kotlin ĊĠĠ Ġ* Ġsuspend Ġfun Ġtest () Ġ= Ġcheck All ( Ar b . string ()) Ġ{ Ġstr Ġ-> ĊĠĠ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ ĊĠĠ Ġ* ĠĠĠĠ Ġshift ( str ) ĊĠĠ Ġ* ĠĠ Ġ}. fold ({ Ġit ĠshouldBe Ġstr Ġ}, Ġ{ Ġfail (" Computation Ġnever Ġfinishes ") Ġ}) ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 0 3 . kt Ġ--> ĊĠĠ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġ< B > Ġshift ( r : ĠR ): ĠB ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRuns Ġthe Ġ[ Cont ] Ġto Ġfinish , Ġreturning Ġ[ B ] Ġor Ġ[ shift ] Ġin Ġcase Ġof Ġ[ R ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` kotlin ĊĠĠ Ġ* Ġfun Ġ< E , ĠA > ĠEither < E , ĠA >. to Cont (): ĠCont < E , ĠA > Ġ= Ġcont Ġ{ ĊĠĠ Ġ* ĠĠ Ġfold ({ Ġe Ġ-> Ġshift ( e ) Ġ}, Ġ:: identity ) ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* ĊĠĠ Ġ* Ġsuspend Ġfun Ġtest () Ġ= Ġcheck All ( Ar b . either ( Ar b . string (), ĠA rb . int ())) Ġ{ Ġeither Ġ-> ĊĠĠ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ ĊĠĠ Ġ* ĠĠĠĠ Ġval Ġx : ĠInt Ġ= Ġeither . to Cont (). bind () ĊĠĠ Ġ* ĠĠĠĠ Ġx ĊĠĠ Ġ* ĠĠ Ġ}. to Either () ĠshouldBe Ġeither ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 0 4 . kt Ġ--> ĊĠĠ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġ< B > ĠCont < R , ĠB >. bind (): ĠB Ġ= Ġfold ( this @ Cont Effect :: shift , Ġ:: identity ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFold s Ġ[ Either ] Ġinto Ġ[ Cont ], Ġby Ġreturning Ġ[ B ] Ġor Ġa Ġshift Ġwith Ġ[ R ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` kotlin ĊĠĠ Ġ* Ġsuspend Ġfun Ġtest () Ġ= Ġcheck All ( Ar b . either ( Ar b . string (), ĠA rb . int ())) Ġ{ Ġeither Ġ-> ĊĠĠ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ ĊĠĠ Ġ* ĠĠĠĠ Ġval Ġx : ĠInt Ġ= Ġeither . bind () ĊĠĠ Ġ* ĠĠĠĠ Ġx ĊĠĠ Ġ* ĠĠ Ġ}. to Either () ĠshouldBe Ġeither ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 0 5 . kt Ġ--> ĊĠĠ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġ< B > ĠEither < R , ĠB >. bind (): ĠB Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠEither . Left Ġ-> Ġshift ( value ) ĊĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġvalue ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFold s Ġ[ Validated ] Ġinto Ġ[ Cont ], Ġby Ġreturning Ġ[ B ] Ġor Ġa Ġshift Ġwith Ġ[ R ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` kotlin ĊĠĠ Ġ* Ġsuspend Ġfun Ġtest () Ġ= Ġcheck All ( Ar b . validated ( Ar b . string (), ĠA rb . int ())) Ġ{ Ġvalidated Ġ-> ĊĠĠ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ ĊĠĠ Ġ* ĠĠĠĠ Ġval Ġx : ĠInt Ġ= Ġvalidated . bind () ĊĠĠ Ġ* ĠĠĠĠ Ġx ĊĠĠ Ġ* ĠĠ Ġ}. to Validated () ĠshouldBe Ġvalidated ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 0 6 . kt Ġ--> ĊĠĠ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġ< B > ĠValid ated < R , ĠB >. bind (): ĠB Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠValid ated . Valid Ġ-> Ġvalue ĊĠĠĠĠĠ Ġis ĠValid ated . Invalid Ġ-> Ġshift ( value ) ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFold s Ġ[ Result ] Ġinto Ġ[ Cont ], Ġby Ġreturning Ġ[ B ] Ġor Ġa Ġtransform ing Ġ[ Throwable ] Ġinto Ġ[ R ] Ġand ĊĠĠ Ġ* Ġsh ifting Ġthe Ġresult . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` kotlin ĊĠĠ Ġ* Ġprivate Ġval Ġdefault Ġ= Ġ" failed " ĊĠĠ Ġ* Ġsuspend Ġfun Ġtest () Ġ= Ġcheck All ( Ar b . result ( Ar b . int ())) Ġ{ Ġresult Ġ-> ĊĠĠ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ ĊĠĠ Ġ* ĠĠĠĠ Ġval Ġx : ĠInt Ġ= Ġresult . bind Ġ{ Ġ_: ĠThrowable Ġ-> Ġdefault Ġ} ĊĠĠ Ġ* ĠĠĠĠ Ġx ĊĠĠ Ġ* ĠĠ Ġ}. fold ({ Ġdefault Ġ}, Ġ:: identity ) ĠshouldBe Ġresult . getOrElse Ġ{ Ġdefault Ġ} ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 0 7 . kt Ġ--> ĊĠĠ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġ< B > ĠResult < B >. bind ( transform : Ġ( Throwable ) Ġ-> ĠR ): ĠB Ġ= ĊĠĠĠ Ġfold (:: identity ) Ġ{ Ġthrowable Ġ-> Ġshift ( transform ( throwable )) Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFold s Ġ[ Option ] Ġinto Ġ[ Cont ], Ġby Ġreturning Ġ[ B ] Ġor Ġa Ġtransform ing Ġ[ None ] Ġinto Ġ[ R ] Ġand Ġsh ifting Ġthe ĊĠĠ Ġ* Ġresult . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` kotlin ĊĠĠ Ġ* Ġprivate Ġval Ġdefault Ġ= Ġ" failed " ĊĠĠ Ġ* Ġsuspend Ġfun Ġtest () Ġ= Ġcheck All ( Ar b . option ( Ar b . int ())) Ġ{ Ġoption Ġ-> ĊĠĠ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ ĊĠĠ Ġ* ĠĠĠĠ Ġval Ġx : ĠInt Ġ= Ġoption . bind Ġ{ Ġdefault Ġ} ĊĠĠ Ġ* ĠĠĠĠ Ġx ĊĠĠ Ġ* ĠĠ Ġ}. fold ({ Ġdefault Ġ}, Ġ:: identity ) ĠshouldBe Ġoption . getOrElse Ġ{ Ġdefault Ġ} ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 0 8 . kt Ġ--> ĊĠĠ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġ< B > ĠOption < B >. bind ( shift : Ġ() Ġ-> ĠR ): ĠB Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ ĠNone Ġ-> Ġshift ( shift ()) ĊĠĠĠĠĠ Ġis ĠSome Ġ-> Ġvalue ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġensure Ġthat Ġcondition Ġis Ġ` true `, Ġif Ġit 's Ġ` false ` Ġit Ġwill Ġ` shift ` Ġwith Ġthe Ġprovided Ġvalue Ġ[ R ]. ĊĠĠ Ġ* ĠMonad ic Ġversion Ġof Ġ[ kotlin . require ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` kotlin ĊĠĠ Ġ* Ġsuspend Ġfun Ġtest () Ġ= Ġcheck All ( Ar b . boolean (), ĠA rb . string (), ĠA rb . int ()) Ġ{ Ġcondition , Ġfailure , Ġint Ġ-> ĊĠĠ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ ĊĠĠ Ġ* ĠĠĠĠ Ġensure ( condition ) Ġ{ Ġfailure Ġ} ĊĠĠ Ġ* ĠĠĠĠ Ġint ĊĠĠ Ġ* ĠĠ Ġ}. to Either () ĠshouldBe Ġif ( condition ) ĠEither . Right ( int ) Ġelse ĠEither . Left ( failure ) ĊĠĠ Ġ* Ġ} ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 0 9 . kt Ġ--> ĊĠĠ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġsuspend Ġfun Ġensure ( condition : ĠBoolean , Ġshift : Ġ() Ġ-> ĠR ): ĠUnit Ġ= ĊĠĠĠ Ġif Ġ( condition ) ĠUnit Ġelse Ġshift ( shift ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠEnsure Ġthat Ġ[ value ] Ġis Ġnot Ġ` null `. Ġif Ġit 's Ġnon - null Ġit Ġwill Ġbe Ġsmart - cast ed Ġand Ġreturned Ġif Ġit 's Ċ Ġ* Ġ` false ` Ġit Ġwill Ġ` shift ` Ġwith Ġthe Ġprovided Ġvalue Ġ[ R ]. ĠMonad ic Ġversion Ġof Ġ[ kotlin . require NotNull ]. Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġsuspend Ġfun Ġtest () Ġ= Ġcheck All ( Ar b . string (), ĠA rb . int (). or Null ()) Ġ{ Ġfailure , Ġint : ĠInt ? Ġ-> Ċ Ġ* ĠĠ Ġcont < String , ĠInt > Ġ{ Ċ Ġ* ĠĠĠĠ Ġensure NotNull ( int ) Ġ{ Ġfailure Ġ} Ċ Ġ* ĠĠ Ġ}. to Either () ĠshouldBe Ġ( int ?. right () Ġ?: Ġfailure . left ()) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ġ<! --- ĠK N IT Ġexample - cont - 1 0 . kt Ġ--> Ċ Ġ* Ġ<! --- ĠTEST Ġlines . isEmpty () Ġ--> Ċ Ġ*/ Ċ @ Opt In ( Experimental Contracts :: class ) Ġ// ĠContract s Ġnot Ġavailable Ġon Ġopen Ġfunctions , Ġso Ġtop - level . Ċ public Ġsuspend Ġfun Ġ< R , ĠB Ġ: ĠAny > ĠCont Effect < R >. ensure NotNull ( value : ĠB ?, Ġshift : Ġ() Ġ-> ĠR ): ĠB Ġ{ ĊĠ Ġcontract Ġ{ Ġreturns () Ġimplies Ġ( value Ġ!= Ġnull ) Ġ} ĊĠ Ġreturn Ġvalue Ġ?: Ġshift ( shift ()) Ċ } Ċ Ċ /** Ċ Ġ* Ġ** AV OID ĠUSING ĠTHIS ĠTYPE , Ġit 's Ġmeant Ġfor Ġlow - level Ġcancellation Ġcode ** ĠWhen Ġin Ġneed Ġin Ġlow - level Ċ Ġ* Ġcode , Ġyou Ġcan Ġuse Ġthis Ġtype Ġto Ġdifferent iate Ġbetween Ġa Ġforeign Ġ[ Cancellation Exception ] Ġand Ġthe Ċ Ġ* Ġone Ġfrom Ġ[ Cont ]. Ċ Ġ*/ Ċ public Ġsealed Ġclass ĠShift Cancellation Exception Ġ: ĠC ancellation Exception (" Shift ed ĠContinu ation ") Ċ Ċ // Ġ ĠHold s Ġ` R ` Ġand Ġ` suspend Ġ( R ) Ġ-> ĠB `, Ġthe Ġexception Ġthat Ġwins Ġthe Ġrace , Ġwill Ġget Ġto Ġexecute Ċ // Ġ` recover `. Ċ private Ġclass ĠInternal ( val Ġtoken : ĠToken , Ġval Ġshifted : ĠAny ?, Ġval Ġrecover : Ġsuspend Ġ( Any ?) Ġ-> ĠAny ?) Ġ: ĊĠ ĠShift Cancellation Exception () Ġ{ ĊĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Shift Cancellation Exception ($ message )" Ċ } Ċ Ċ private Ġclass ĠE ager ( val Ġtoken : ĠToken , Ġval Ġshifted : ĠAny ?, Ġval Ġrecover : Ġ( Any ?) Ġ-> ĠAny ?) Ġ: ĊĠ ĠShift Cancellation Exception () Ġ{ ĊĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Shift Cancellation Exception ($ message )" Ċ } Ċ Ċ // ĠClass Ġthat Ġrepresents Ġa Ġunique Ġtoken Ġby Ġhash Ġcomparison Ċ private Ġclass ĠToken Ġ{ ĊĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Token (${ hashCode (). to UInt (). toString ( 1 6 )}) " Ċ } Ċ Ċ @ Jvm Inline Ċ private Ġvalue Ġclass ĠCont Impl < R , ĠA >( private Ġval Ġf : Ġsuspend ĠCont Effect < R >. () Ġ-> ĠA ) Ġ: ĠCont < R , ĠA > Ġ{ ĊĊĠ Ġoverride Ġfun Ġattempt (): ĠCont < R , ĠResult < A >> Ġ= ĠCont Impl Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ ĠResult . success ( f ()) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ ĠResult . failure ( e . non Fatal OrThrow ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠWe Ġcreate Ġa Ġ` Token ` Ġfor Ġfold ĠContinu ation , Ġso Ġwe Ġcan Ġproperly Ġdifferent iate Ġbetween Ġnested ĊĠ Ġ// Ġfold s ĊĠ Ġoverride Ġsuspend Ġfun Ġ< B > Ġfold ( recover : Ġsuspend Ġ( R ) Ġ-> ĠB , Ġtransform : Ġsuspend Ġ( A ) Ġ-> ĠB ): ĠB Ġ= ĊĠĠĠĠĠ Ġsuspend Coroutine Un intercept ed Or Return Ġ{ Ġcont Ġ-> ĊĠĠĠ Ġval Ġtoken Ġ= ĠToken () ĊĠĠĠ Ġval Ġeffect Ġ= ĊĠĠĠĠĠ Ġobject Ġ: ĠCont Effect < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠShift Ġaway Ġfrom Ġthis ĠContinu ation Ġby Ġintercept ing Ġit , Ġand Ġcomplet ing Ġit Ġwith ĊĠĠĠĠĠĠĠ Ġ// ĠShift Cancellation Exception ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġneeded Ġbecause Ġthis Ġfunction Ġwill Ġnever Ġyield Ġa Ġresult , ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġit Ġneeds Ġto Ġbe Ġcancelled Ġto Ġproperly Ġsupport Ġcoroutine Ġcancellation ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< B > Ġshift ( r : ĠR ): ĠB Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠSome Ġinteresting Ġcon sequences Ġof Ġhow ĠContinu ation ĠC ancellation Ġworks Ġin ĠKotlin . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġhave Ġto Ġthrow ĠC ancellation Exception Ġto Ġsignal Ġthe ĠContinu ation Ġwas Ġcancelled , Ġand Ġwe ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġshifted Ġaway . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġhowever Ġalso Ġmeans Ġthat Ġthe Ġuser Ġcan Ġtry / catch Ġshift Ġand Ġrecover Ġfrom Ġthe ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠC ancellation Exception Ġand Ġthus Ġeffectively Ġrecover ing Ġfrom Ġthe Ġcancellation / shift . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġmeans Ġtry / catch Ġis Ġalso Ġcapable Ġof Ġrecover ing Ġfrom Ġmon adic Ġerrors . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠSee : ĠCont Spec Ġ- Ġtry / catch Ġtests ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal ( token , Ġr , Ġrecover Ġas Ġsuspend Ġ( Any ?) Ġ-> ĠAny ?) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġsuspend Ġ{ Ġtransform ( f ( effect )) Ġ} ĊĠĠĠĠĠĠĠ Ġ. start Coroutine Un intercept ed Or Return ( Fold Continuation ( token , Ġcont . context , Ġcont )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠInternal ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( token Ġ== Ġe . token ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf : Ġsuspend Ġ() Ġ-> ĠB Ġ= Ġ{ Ġe . recover ( e . shift ed ) Ġas ĠB Ġ} ĊĠĠĠĠĠĠĠ Ġf . start Coroutine Un intercept ed Or Return ( cont ) ĊĠĠĠĠĠ Ġ} Ġelse Ġthrow Ġe ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠContinu ation Ġthat Ġruns Ġthe Ġ` recover ` Ġfunction , Ġafter Ġattempting Ġto Ġcalculate Ġ[ B ]. ĠIn Ġcase Ġwe Ċ Ġ* Ġencounter Ġa Ġ` shift ` Ġafter Ġsus pension , Ġwe Ġwill Ġreceive Ġ[ Result . failure ] Ġwith Ċ Ġ* Ġ[ Shift Cancellation Exception ]. ĠIn Ġthat Ġcase Ġwe Ġstill Ġneed Ġto Ġrun Ġ` suspend Ġ( R ) Ġ-> ĠB `, Ġwhich Ġis Ġwhat Ċ Ġ* Ġwe Ġdo Ġinside Ġthe Ġbody Ġof Ġthis Ġ` Continuation `, Ġand Ġwe Ġcomplete Ġthe Ġ[ parent ] Ġ[ Continuation ] Ġwith Ċ Ġ* Ġthe Ġresult . Ċ Ġ*/ Ċ private Ġclass ĠFold Continuation < B >( ĊĠ Ġprivate Ġval Ġtoken : ĠToken , ĊĠ Ġoverride Ġval Ġcontext : ĠCor outine Context , ĊĠ Ġprivate Ġval Ġparent : ĠContinu ation < B > Ċ ) Ġ: ĠContinu ation < B > Ġ{ ĊĠ Ġoverride Ġfun Ġresume With ( result : ĠResult < B >) Ġ{ ĊĠĠĠ Ġresult . fold ( parent :: resume ) Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠ Ġif Ġ( throwable Ġis ĠInternal Ġ&& Ġtoken Ġ== Ġthrowable . token ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf : Ġsuspend Ġ() Ġ-> ĠB Ġ= Ġ{ Ġthrowable . recover ( throwable . shift ed ) Ġas ĠB Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġres Ġ= Ġf . start Coroutine Un intercept ed Or Return ( parent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠCOR OUT INE _ SUS PEN DED Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparent . resume ( res Ġas ĠB ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġparent . resume With ( result ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ @ Jvm Inline Ċ internal Ġvalue Ġclass ĠE ager Control Dsl < R , ĠA >( ĊĠ Ġprivate Ġval Ġcont : Ġsuspend ĠE ager Cont Effect < R >. () Ġ-> ĠA Ċ ) Ġ: ĠE ager Control < R , ĠA > Ġ{ ĊĠ Ġoverride Ġfun Ġ< B > Ġfold ( recover : Ġ( R ) Ġ-> ĠB , Ġtransform : Ġ( A ) Ġ-> ĠB ): ĠB Ġ{ ĊĠĠĠ Ġval Ġtoken Ġ= ĠToken () ĊĠĠĠ Ġval Ġeffect Ġ= ĊĠĠĠĠĠ Ġobject Ġ: ĠE ager Cont Effect < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠShift Ġaway Ġfrom Ġthis ĠContinu ation Ġby Ġintercept ing Ġit , Ġand Ġcomplet ing Ġit Ġwith ĊĠĠĠĠĠĠĠ Ġ// ĠShift Cancellation Exception ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġneeded Ġbecause Ġthis Ġfunction Ġwill Ġnever Ġyield Ġa Ġresult , ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġit Ġneeds Ġto Ġbe Ġcancelled Ġto Ġproperly Ġsupport Ġcoroutine Ġcancellation ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< B > Ġshift ( r : ĠR ): ĠB Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠSome Ġinteresting Ġcon sequences Ġof Ġhow ĠContinu ation ĠC ancellation Ġworks Ġin ĠKotlin . ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġhave Ġto Ġthrow ĠC ancellation Exception Ġto Ġsignal Ġthe ĠContinu ation Ġwas Ġcancelled , Ġand Ġwe ĊĠĠĠĠĠĠĠ Ġ// Ġshifted Ġaway . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġhowever Ġalso Ġmeans Ġthat Ġthe Ġuser Ġcan Ġtry / catch Ġshift Ġand Ġrecover Ġfrom Ġthe ĊĠĠĠĠĠĠĠ Ġ// ĠC ancellation Exception Ġand Ġthus Ġeffectively Ġrecover ing Ġfrom Ġthe Ġcancellation / shift . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġmeans Ġtry / catch Ġis Ġalso Ġcapable Ġof Ġrecover ing Ġfrom Ġmon adic Ġerrors . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠSee : ĠCont Spec Ġ- Ġtry / catch Ġtests ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠE ager ( token , Ġr , Ġrecover Ġas Ġ( Any ?) Ġ-> ĠAny ?) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġvar Ġresult : ĠAny ? Ġ= ĠEmpty Value ĊĠĠĠĠĠ Ġsuspend Ġ{ Ġtransform ( cont ( effect )) Ġ} ĊĠĠĠĠĠĠĠ Ġ. start Coroutine Un intercept ed Or Return ( Continuation ( Empty Coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . fold ({ Ġresult Ġ= Ġit Ġ}) Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġis ĠE ager Ġ&& Ġtoken Ġ== Ġthrowable . token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . recover ( throwable . shift ed ) Ġas ĠB ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġthrow Ġthrowable ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġresult Ġas ĠB ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠE ager ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( token Ġ== Ġe . token ) Ġe . recover ( e . shift ed ) Ġas ĠB ĊĠĠĠĠĠ Ġelse Ġthrow Ġe ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ