/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠAt ul ĠGu pta . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ @ file : Suppress (" unused ") Ċ Ċ package Ġcom . app . u ist ate lib Ċ Ċ import Ġcom . app . u ist ate lib . Ui State . Failure Ċ import Ġkotlin . contracts . Experimental Contracts Ċ import Ġkotlin . contracts . Invocation Kind Ċ import Ġkotlin . contracts . contract Ċ Ċ /** Ċ Ġ* ĠA Ġdis crimin ated Ġunion Ġthat Ġencaps ulates Ġa Ġsuccessful Ġoutcome Ġwith Ġa Ġvalue Ġof Ġtype Ġ[ M ] Ċ Ġ* Ġor Ġa Ġfailure Ġwith Ġvalue Ġof Ġtype Ġ[ E ] Ċ Ġ* Ġor Ġa Ġloading / initial Ġstate Ġof Ġthe Ġoperation Ċ Ġ*/ Ċ public Ġsealed Ġclass ĠUi State < out ĠM , Ġout ĠE > Ġ{ ĊĊĠĠĠ Ġpublic Ġdata Ġclass ĠSuccess < out ĠM >( val Ġvalue : ĠM ) Ġ: ĠUi State < M , ĠNothing >() ĊĊĠĠĠ Ġpublic Ġobject ĠLoading Ġ: ĠUi State < Nothing , ĠNothing >() ĊĊĠĠĠ Ġpublic Ġdata Ġclass ĠFailure < out ĠE >( val Ġfailure Value : ĠE ) Ġ: ĠUi State < Nothing , ĠE >() ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠSERVER _ ERROR : ĠInt Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠCLIENT _ ERROR : ĠInt Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠNET WORK _ ERROR : ĠInt Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠUNKNOWN _ ERROR : ĠInt Ġ= Ġ 4 ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠPerforms Ġthe Ġ[ success Block ] Ġfunction Ġfor Ġthe Ġencaps ulated Ġvalue Ġ[ M ] Ġif Ġthis Ġinstance Ġrepresents Ġ[ success ][ Ui State . Success ] Ċ Ġ* Ġor Ġperforms Ġthe Ġ[ failure Block ] Ġfunction Ġfor Ġthe Ġencaps ulated Ġ[ Ui State . Failure ] Ġif Ġit Ġis Ġ[ failure ][ Ui State . Failure ]. Ċ Ġ* Ċ Ġ* ĠNote , Ġthat Ġthis Ġfunction Ġre throws Ġany Ġ[ Throwable ] Ġexception Ġthrown Ġby Ġ[ success Block ] Ġor Ġby Ġ[ failure Block ] Ġfunction . Ċ Ġ*/ Ċ @ Opt In ( Experimental Contracts :: class ) Ċ public Ġinline Ġfun Ġ< M , ĠE > ĠUi State < M , ĠE >. fold ( ĊĠĠĠ Ġfailure Block : Ġ( failure Value : ĠE ) Ġ-> ĠUnit Ġ= Ġ{ Ġ}, ĊĠĠĠ Ġsuccess Block : Ġ( value : ĠM ) Ġ-> ĠUnit , Ċ ): ĠUi State < M , ĠE > Ġ{ ĊĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠ Ġcalls In Place ( failure Block , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠĠĠĠĠ Ġcalls In Place ( success Block , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Block ( this . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġno - op Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠFailure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Block ( this . failure Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠPerforms Ġthe Ġgiven Ġ[ success Block ] Ġon Ġthe Ġencaps ulated Ġvalue Ġif Ġthis Ġinstance Ġrepresents Ġ[ success ][ Ui State . Success ]. Ċ Ġ* Ġ@ return Ġthe Ġoriginal Ġ` Ui State ` Ġunchanged . Ċ Ġ*/ Ċ @ Opt In ( Experimental Contracts :: class ) Ċ public Ġinline Ġfun Ġ< M , ĠE > ĠUi State < M , ĠE >. on Success ( ĊĠĠĠ Ġsuccess Block : Ġ( value : ĠM ) Ġ-> ĠUnit , Ċ ): ĠUi State < M , ĠE > Ġ{ ĊĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠ Ġcalls In Place ( success Block , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Block ( this . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġno - op Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠFailure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġno - op Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠPerforms Ġthe Ġgiven Ġ[ failure Block ] Ġon Ġthe Ġ[ Ui State . Failure ] Ġvalue Ġif Ġthis Ġinstance Ġrepresents Ġ[ failure ][ Ui State . Failure ]. Ċ Ġ* Ġ@ return Ġthe Ġoriginal Ġ` Ui State ` Ġunchanged . Ċ Ġ*/ Ċ @ Opt In ( Experimental Contracts :: class ) Ċ public Ġinline Ġfun Ġ< M , ĠE > ĠUi State < M , ĠE >. on Failure ( ĊĠĠĠ Ġfailure Block : Ġ( failure Value : ĠE ) Ġ-> ĠUnit , Ċ ): ĠUi State < M , ĠE > Ġ{ ĊĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠ Ġcalls In Place ( failure Block , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġno - op Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġno - op Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠFailure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Block ( this . failure Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġencaps ulated Ġresult Ġof Ġthe Ġgiven Ġ[ transform ] Ġfunction Ġapplied Ġto Ġthe Ġencaps ulated Ġvalue Ċ Ġ* Ġif Ġthis Ġinstance Ġrepresents Ġ[ success ][ Ui State . Success ] Ġor Ġthe Ċ Ġ* Ġoriginal Ġencaps ulated Ġ[ Ui State ] Ġif Ġit Ġis Ġ[ failure ][ Ui State . Failure ] Ġor Ġ[ loading ][ Ui State . Loading ]. Ċ Ġ* Ċ Ġ* ĠNote , Ġthat Ġthis Ġfunction Ġre throws Ġany Ġ[ Throwable ] Ġexception Ġthrown Ġby Ġ[ transform ] Ġfunction . Ċ Ġ* ĠSee Ġ[ flatMap ] Ġfor Ġan Ġalternative Ġthat Ġencaps ulates Ġexceptions Ġand Ġloading Ġstate . Ċ Ġ*/ Ċ @ Opt In ( Experimental Contracts :: class ) Ċ public Ġinline Ġfun Ġ< M , ĠT , ĠE > ĠUi State < M , ĠE >. map ( ĊĠĠĠ Ġtransform : Ġ( M ) Ġ-> ĠT , Ċ ): ĠUi State < T , ĠE > Ġ{ ĊĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠ Ġcalls In Place ( transform , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUi State . Success ( transform ( this . value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠFailure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġencaps ulated Ġresult Ġof Ġthe Ġgiven Ġ[ transform ] Ġfunction Ġapplied Ġto Ġthe Ġencaps ulated Ġvalue Ċ Ġ* Ġif Ġthis Ġinstance Ġrepresents Ġ[ success ][ Ui State . Success ] Ġor Ċ Ġ* Ġoriginal Ġencaps ulated Ġ[ Ui State ] Ġif Ġit Ġis Ġ[ failure ][ Ui State . Failure ] Ġor Ġ[ loading ][ Ui State . Loading ]. Ċ Ġ* Ċ Ġ* ĠThis Ġfunction Ġcat ches Ġany Ġ[ Ui State ] Ġfailure Ġor Ġloading Ġstate Ġemitted Ġby Ġ[ transform ] Ġfunction Ġand Ġencaps ulates Ġit Ġas Ġa Ġcorresponding Ġ[ Ui State ]. Ċ Ġ* ĠIn Ġcase , Ġwhen Ġfirst Ġoperation Ġfails Ġthen Ġ[ E ] Ġinformation Ġis Ġlost Ġand Ġgeneric Ġ[ Failure ] Ġwith Ġ[ Throwable ] Ġis Ġthrown . Ċ Ġ* ĠMessage Ġof Ġthe Ġthrown Ġ[ Throwable ] Ġis Ġ[ PREVIOUS _ OP _ FAILED ] Ċ Ġ* ĠSee Ġ[ map ] Ġfor Ġan Ġalternative Ġthat Ġre throws Ġexceptions Ġfrom Ġ` transform ` Ġfunction . Ċ Ġ*/ Ċ @ Opt In ( Experimental Contracts :: class ) Ċ public Ġinline Ġfun Ġ< M , ĠT , ĠE > ĠUi State < M , ĠE >. flatMap ( ĊĠĠĠ Ġtransform : Ġ( M ) Ġ-> ĠT , Ċ ): ĠUi State < T , ĠThrowable ?> Ġ{ ĊĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠ Ġcalls In Place ( transform , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ( this . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUi State . Success ( result . get OrThrow ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFailure ( result . exception OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠUi State . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠFailure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPri or it izing ĠSuccess Ġover Ġfailure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġcase Ġwe Ġare Ġlo sing Ġ` E ` Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFailure ( failure Value Ġ= ĠRuntimeException ( PREVIOUS _ OP _ FAILED )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġconst Ġval ĠPRE V IOUS _ OP _ FAILED : ĠString Ġ= Ġ" previous _ op _ failed "