package Ġcom . ke vin most . k ool bel t . util Ċ Ċ /** Ċ Ġ* ĠUse Ġthe ĠDSL Ġmethods Ġ[ Retry Context . return Fail ] Ġand Ġ[ Retry Context . return Success ] Ġto Ġmark Ġeach Ġrun Ġas Ġa Ġsuccess Ċ Ġ* Ġor Ġa Ġfailure . ĠUse Ġ[ Retry Context . return Abort ] Ġto Ġimmediately Ġreturn Ġas Ġa Ġfailure . Ċ Ġ*/ Ċ inline Ġfun Ġ< T > Ġretry ( num Times : ĠInt , ĊĠĠĠ Ġcross inline Ġblock : ĠRetry Context < T >. () Ġ-> ĠResult < T >) ĊĠĠĠ Ġ: ĠResult < T > Ġ{ ĊĠ Ġval Ġcontext Ġ= ĠRetry Context < T >( num Times ) ĊĠ Ġreturn Ġcontext . run Ġ{ Ġblock ( context ) Ġ} Ċ } Ċ Ċ class ĠRetry Context < T >( private Ġval Ġmax Retries : ĠInt ) Ġ{ ĊĊĠ Ġvar Ġnum Failures So Far Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġset ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠMark Ġthis Ġrun Ġas Ġa Ġfailure Ġand Ġtry Ġagain Ġif Ġwe Ġhaven 't Ġhit Ġ[ max Retries ]. ĠIf Ġthis Ġis Ġthe Ġfinal ĊĠĠ Ġ* Ġfailing Ġrun , Ġreturn Ġ[ value ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġreturn Fail ( value : ĠT ? Ġ= Ġnull ): ĠResult . Failure < T > Ġ= ĠResult . Failure ( value ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠMark Ġthis Ġrun Ġas Ġa Ġfailure Ġand Ġtry Ġagain Ġif Ġwe Ġhaven 't Ġhit Ġ[ max Retries ]. ĠIf Ġthis Ġis Ġthe Ġfinal ĊĠĠ Ġ* Ġfailing Ġrun , Ġreturn Ġthe Ġresult Ġof Ġinvoking Ġ[ supplier ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġreturn Fail ( supplier : Ġ() Ġ-> ĠT ?): ĠResult . Failure < T > Ġ= ĠResult . Failure ( supplier ()) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠIm mediate ly Ġreturn Ġas Ġa Ġfailure Ġwith Ġthis Ġvalue . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġreturn Abort ( value : ĠT ? Ġ= Ġnull ): ĠResult . Abort < T > Ġ= ĠResult . Abort ( value ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠIm mediate ly Ġreturn Ġas Ġa Ġfailure Ġwith Ġthe Ġresult Ġof Ġthis Ġfunction ĊĠĠ Ġ*/ ĊĠ Ġfun Ġreturn Abort ( supplier : Ġ() Ġ-> ĠT ?): ĠResult . Abort < T > Ġ= ĠResult . Abort ( supplier ()) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturn Ġthis Ġvalue Ġas Ġa Ġsuccessful Ġvalue ĊĠĠ Ġ*/ ĊĠ Ġfun Ġreturn Success ( value : ĠT ? Ġ= Ġnull ): ĠResult . Success < T > Ġ= ĠResult . Success ( value ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturn Ġthe Ġresult Ġof Ġthis Ġfunction Ġas Ġa Ġsuccessful Ġvalue ĊĠĠ Ġ*/ ĊĠ Ġfun Ġreturn Success ( supplier : Ġ() Ġ-> ĠT ?): ĠResult . Success < T > Ġ= ĠResult . Success ( supplier ()) ĊĊĠ Ġfun Ġrun ( block : Ġ( Retry Context < T >) Ġ-> ĠResult < T >): ĠResult < T > Ġ{ ĊĠĠĠ Ġvar Ġlast Failure : ĠResult . Failure < T >? Ġ= Ġnull ĊĠĠĠ Ġwhile Ġ( num Failures So Far Ġ< Ġmax Retries ) Ġ{ ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġblock ( this ) ĊĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠResult . Success , Ġis ĠResult . Abort Ġ-> Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġis ĠResult . Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnum Failures So Far ++ ĊĠĠĠĠĠĠĠĠĠ Ġlast Failure Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlast Failure Ġ?: ĠResult . Failure < T >( null ) ĊĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠResult < T >( val Ġvalue : ĠT ?) Ġ{ ĊĠ Ġclass ĠSuccess < T > Ġinternal Ġconstructor ( value : ĠT ?) Ġ: ĠResult < T >( value ) ĊĠ Ġclass ĠFailure < T > Ġinternal Ġconstructor ( fail Value : ĠT ?) Ġ: ĠResult < T >( fail Value ) ĊĠ Ġclass ĠAbort < T > Ġinternal Ġconstructor ( abort Value : ĠT ?) Ġ: ĠResult < T >( abort Value ) Ċ } Ċ