/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 2 0 ĠN HS X . ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ Ċ package Ġuk . n hs . n hs x . sonar . android . app . functional types Ċ Ċ import Ġuk . n hs . n hs x . sonar . android . app . functional types . Promise . State . Explanation Ċ import Ġuk . n hs . n hs x . sonar . android . app . functional types . Promise . State . Failed Ċ import Ġuk . n hs . n hs x . sonar . android . app . functional types . Promise . State . InProgress Ċ import Ġuk . n hs . n hs x . sonar . android . app . functional types . Promise . State . Succeeded Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ class ĠPromise < T Ġ: ĠAny ?> Ġprivate Ġconstructor () Ġ{ ĊĊĠĠĠ Ġsealed Ġclass ĠState < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠIn Progress < T > Ġ: ĠState < T >() ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSuc ceeded < T >( val Ġvalue : ĠT ) Ġ: ĠState < T >() ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠFailed < T >( val Ġreason : ĠEx planation ) Ġ: ĠState < T >() ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠEx planation ( val Ġmessage : ĠString , Ġval Ġexception : ĠException ? Ġ= Ġnull , Ġval Ġcode : ĠInt ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( exception : ĠException ) Ġ: Ġthis ( exception . message Ġ?: Ġ" Exception ", Ġexception , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġstate : ĠState < T > Ġ= ĠIn Progress () ĊĊĠĠĠ Ġval Ġis InProgress Ġget () Ġ= Ġstate Ġis ĠIn Progress ĊĠĠĠ Ġval Ġis Success Ġget () Ġ= Ġstate Ġis ĠSuc ceeded ĊĠĠĠ Ġval Ġis Failed Ġget () Ġ= Ġstate Ġis ĠFailed ĊĊĠĠĠ Ġval Ġvalue ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġs Ġ= Ġstate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSuc ceeded Ġ-> Ġs . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġerror ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġs Ġ= Ġstate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFailed Ġ-> Ġs . reason ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠCallback < U Ġ: ĠAny ? >( val Ġf : Ġ( U ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtriggered Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġtrigger ( value : ĠU ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( triggered . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsuccess Callbacks Ġ= Ġmutable ListOf < Callback < T >>() ĊĠĠĠ Ġprivate Ġval Ġerror Callbacks Ġ= Ġmutable ListOf < Callback < Explanation >>() ĊĊĠĠĠ Ġfun ĠonSuccess ( function : Ġ( T ) Ġ-> ĠUnit ): ĠPromise < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġsuccess Callbacks . add ( Callback ( function )) ĊĠĠĠĠĠĠĠ Ġtrigger () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonError ( function : Ġ( Explanation ) Ġ-> ĠUnit ): ĠPromise < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġerror Callbacks . add ( Callback ( function )) ĊĠĠĠĠĠĠĠ Ġtrigger () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< U Ġ: ĠAny ?> Ġmap ( mapping : Ġ( T ) Ġ-> ĠU ): ĠPromise < U > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeferred Ġ= ĠDeferred < U >() ĊĠĠĠĠĠĠĠ ĠonSuccess Ġ{ Ġdeferred . resolve ( mapping ( it )) Ġ} ĊĠĠĠĠĠĠĠ ĠonError Ġ{ Ġdeferred . fail ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdeferred . promise ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmap To Unit (): ĠPromise < Unit > Ġ= ĊĠĠĠĠĠĠĠ Ġmap Ġ{} ĊĊĠĠĠ Ġsuspend Ġfun Ġto Coroutine Unsafe (): ĠT Ġ= Ġto Coroutine (). or Throw () ĊĊĠĠĠ Ġsuspend Ġfun Ġto Coroutine (): ĠResult < T > Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠResult . Success ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoroutine Result Ġ= Ġkotlin . Result . success ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume With ( coroutine Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġit . exception Ġ?: ĠIllegalStateException ( it . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠResult . Failure < T >( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoroutine Result Ġ= Ġkotlin . Result . success ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume With ( coroutine Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtrigger () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġs Ġ= Ġstate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSuc ceeded Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Callbacks . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . trigger ( s . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFailed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Callbacks . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . trigger ( s . reason ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDeferred < T Ġ: ĠAny ?> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpromise Ġ= ĠPromise < T >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġresolve ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . state Ġ= ĠSuc ceeded ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . trigger () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfail ( reason : ĠEx planation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . state Ġ= ĠFailed ( reason ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . trigger () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfail ( exception : ĠException ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail ( Explanation ( exception )) ĊĊĠĠĠĠĠĠĠ Ġfun Ġfail ( message : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail ( Explanation ( message )) ĊĠĠĠ Ġ} Ċ } Ċ