/** Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠSys data ĠS . p . a . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ package Ġit . sys data . kt android architecture core . inter actor Ċ Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġit . sys data . kt android architecture core . exception . Failure Ċ import Ġit . sys data . kt android architecture core . functional . Either Ċ Ċ /** Ċ Ġ* Ġ[ Action Queue ] Ġallow Ġto Ġdefine Ġa Ġqueue Ġof Ġ[ UseCase ] Ċ Ġ* Ġthey Ġwill Ġbe Ġlaunched Ġone Ġafter Ġthe Ġother Ġand Ġthe ĠModel Ġof Ġprevious Ġ[ UseCase ] Ċ Ġ* Ġwill Ġbe Ġmapping Ġfor ĠParams Ġof Ġnext Ġ[ UseCase ] Ċ Ġ*/ Ċ class ĠAction Queue < Params Ġ: ĠAction Params , ĠUi Model Ġ: ĠAny , ĠLast Model Ġ: ĠAny > Ġprivate Ġconstructor () Ġ{ ĊĠĠĠ Ġ// ĠLive Data Ġfor ĠUi Model ĊĠĠĠ Ġprivate Ġval Ġlive Data Ġ= ĠMutable LiveData < Ui Model >() ĊĊĠĠĠ Ġ// ĠLive Data Ġfor Ġloading Ġstatus Ġ( true Ġif Ġaction Ġis Ġloading ) ĊĠĠĠ Ġprivate Ġval Ġloading LiveData Ġ= ĠMutable LiveData < Boolean >() ĊĊĠĠĠ Ġ// ĠLive Data Ġfor Ġfail Ġstatus ĊĠĠĠ Ġprivate Ġval Ġfailure LiveData Ġ= ĠMutable LiveData < Failure >() ĊĊĠĠĠ Ġ// Last Ġuse Ġcase ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlast UseCase : ĠAction Queue Item < *, Ġ*, Ġ*> ĊĊĠĠĠ Ġ// Check Ġif Ġcall Ġthe Ġlast Ġuse Ġcase ĊĠĠĠ Ġprivate Ġvar Ġis Last Action Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġindex Ġ= Ġ 1 ĊĊĠĠĠ Ġ// Queue Ġof Ġuse Ġcase ĊĠĠĠ Ġprivate Ġval Ġuse Case Queue Ġ= Ġmutable ListOf < Action Queue Item < *, Ġ*, Ġ* >>() ĊĊĠĠĠ Ġ// Mapping Ġfunction Ġfor Ġmapping Ġlast Ġmodel Ġof Ġlast Ġuse Ġcase Ġto ĠUi Model ĊĠĠĠ Ġprivate Ġvar Ġmapping Function : Ġ( Last Model ) Ġ-> ĠUi Model ? Ġ= Ġ{ Ġnull Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġthe Ġfirst Ġaction ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams Ġfor Ġfirst Ġuse Ġcase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexecute ( params : ĠParams ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loading LiveData . value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġuse Case Queue . first () ĊĠĠĠĠĠĠĠ Ġloading LiveData . post Value ( true ) ĊĠĠĠĠĠĠĠ Ġif Ġ( use Case Queue . size Ġ== Ġ 1 ) Ġ// check Ġif Ġthe Ġfirst Ġuse Ġcase Ġis Ġthe Ġonly Ġuse Ġcase Ġ( use Ġnormal ĠAction Ġfor Ġthis Ġcase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Last Action Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġitem . execute Without Mapping (:: handle Failure , Ġ:: handle UseCase , Ġparams ) ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġhandle UseCase ( model : ĠT ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġlast Ġaction Ġset Ġthe Ġuser Ġaction Ġfor Ġthe Ġresult Ġuse Ġcase ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġotherwise Ġcall Ġthe Ġaction Ġwith Ġthis Ġfunction Ġas Ġfunction Ġresult ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Last Action Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Last UseCase ( model Ġas ĠAny ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Case Queue . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Last UseCase ( model Ġas ĠAny ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Last Action Ġ= Ġindex Ġ+ Ġ 1 Ġ== Ġuse Case Queue . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġuse Case Queue [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . execute (:: handle Failure , Ġ:: handle UseCase , Ġmodel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failure ( Failure . Null In Queue ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Queue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Last UseCase ( model : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Last Action Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġlast UseCase . execute (:: handle Failure , Ġ:: handle Success , Ġmodel ) ĊĠĠĠĠĠĠĠ Ġreset Queue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Queue () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Last Action Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Failure ( fail : ĠFailure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloading LiveData . post Value ( false ) ĊĠĠĠĠĠĠĠ Ġfailure LiveData . post Value ( fail ) ĊĠĠĠĠĠĠĠ Ġreset Queue () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġhandle Success ( model : ĠT ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġloading LiveData . post Value ( false ) ĊĠĠĠĠĠĠĠ Ġlive Data . post Value ( mapping Function ( model Ġas ĠLast Model )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefine Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġresult ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġfor Ġ[ live Data ] ĊĠĠĠĠ Ġ* Ġ@ param Ġbody Ġ Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġobserve ( owner : ĠLifecycle Owner , Ġbody : Ġ( Ui Model ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlive Data . observe ( owner , ĠObserver ( body )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefine Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġresult Ġwithout Ġmodel ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġfor Ġ[ live Data ] ĊĠĠĠĠ Ġ* Ġ@ param Ġbody Ġ Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġobserve Without Model ( owner : ĠLifecycle Owner , Ġbody : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlive Data . observe ( owner , ĠObserver Ġ{ Ġbody . invoke () Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefine Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġfailure Ġwithout Ġtype Ġof ĠFailure ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġfor Ġ[ failure LiveData ] ĊĠĠĠĠ Ġ* Ġ@ param Ġbody Ġ Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġfailure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġobserve Failure Without Type ( owner : ĠLifecycle Owner , Ġbody : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfailure LiveData . observe ( owner , ĠObserver Ġ{ Ġbody . invoke () Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefine Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġfailure ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġfor Ġ[ failure LiveData ] ĊĠĠĠĠ Ġ* Ġ@ param Ġbody Ġ Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġfailure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġobserve Failure ( owner : ĠLifecycle Owner , Ġbody : Ġ( Failure ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfailure LiveData . observe ( owner , ĠObserver ( body )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefine Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġloading ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġfor Ġ[ loading LiveData ] ĊĠĠĠĠ Ġ* Ġ@ param Ġbody Ġ Ġthe Ġfunction Ġthat Ġwill Ġuse Ġfor Ġhandle Ġthe Ġloading ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġobserve Loading Status ( owner : ĠLifecycle Owner , Ġbody : Ġ( Boolean ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloading LiveData . observe ( owner , ĠObserver ( body )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠAction Queue Item < Params Ġ: ĠAction Params , Ġout ĠModel Ġ: ĠAny , ĠOld Model Ġ: ĠAny > Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġuse Case : ĠUse Case < Model , ĠParams >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġhandle Mapping : Ġ(( Old Model ) Ġ-> ĠParams )? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġfun Ġexecute ( handle Failure : Ġ( Failure ) Ġ-> ĠUnit , Ġhandle Success : Ġ( Any ) Ġ-> ĠUnit , Ġmodel : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case . execute ({ Ġit . either ( handle Failure , Ġhandle Success ) Ġ}, Ġhandle Mapping !! ( model Ġas ĠOld Model )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failure . invoke ( Failure . Internal Error ( e . message )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġfun Ġexecute Without Mapping ( handle Failure : Ġ( Failure ) Ġ-> ĠUnit , Ġhandle Success : Ġ( Any ) Ġ-> ĠUnit , Ġparams : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case . execute ({ Ġit . either ( handle Failure , Ġhandle Success ) Ġ}, Ġparams Ġas ĠParams ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failure . invoke ( Failure . Internal Error ( e . message )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠAction Queue Builder Mapping Ui Model < Params Ġ: ĠAction Params , ĠUi Model Ġ: ĠAny , ĠModel Ġ: ĠAny > Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġaction Queue : ĠAction Queue < Params , ĠUi Model , ĠModel > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġmap Ġfunction Ġfor Ġ[ Action Queue ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġhandle Result Ġfunction Ġfor Ġmapping ĠModel Ġto ĠUi Model ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Builder ] Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild With Ui Model ( handle Result : Ġ( Model ) Ġ-> ĠUi Model ): ĠAction Queue < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Queue . mapping Function Ġ= Ġhandle Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaction Queue ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠAction Queue Builder UseCase < Params Ġ: ĠAction Params , ĠUi Model Ġ: ĠAny , ĠOld Model Ġ: ĠAny > Ġinternal Ġconstructor ( private Ġval Ġaction Queue : ĠAction Queue < Params , ĠUi Model , ĠAny >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġa Ġuse Ġcase Ġthat Ġwill Ġexecute Ġafter Ġprevious Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġuse Case Class Ġjava Ġclass Ġof Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġmapping Ġfunction Ġthat Ġmapping Ġprevious Ġmodel Ġuse Ġcase Ġresult Ġwith Ġparams Ġfor Ġthis ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Builder ] Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġ< Model Ġ: ĠAny , ĠParams UseCase Ġ: ĠAction Params , ĠT Ġ: ĠUse Case < Model , ĠParams UseCase >> Ġadd UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case Class : ĠClass < T >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapping : Ġ( Old Model ) Ġ-> ĠParams UseCase ĊĠĠĠĠĠĠĠ Ġ): ĠAction Queue Builder UseCase < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Queue . use Case Queue . add ( Action Queue Item ( use Case Class . newInstance (), Ġmapping )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction Queue Builder UseCase ( action Queue ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġa Ġuse Ġcase Ġthat Ġwill Ġexecute Ġafter Ġprevious Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġuse Case Class Ġinstance Ġof Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġmapping Ġfunction Ġthat Ġmapping Ġprevious Ġmodel Ġuse Ġcase Ġresult Ġwith Ġparams Ġfor Ġthis ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Builder ] Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġ< Model Ġ: ĠAny , ĠParams UseCase Ġ: ĠAction Params , ĠT Ġ: ĠUse Case < Model , ĠParams UseCase >> Ġadd UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case Class : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapping : Ġ( Old Model ) Ġ-> ĠParams UseCase ĊĠĠĠĠĠĠĠ Ġ): ĠAction Queue Builder UseCase < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Queue . use Case Queue . add ( Action Queue Item ( use Case Class , Ġmapping )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction Queue Builder UseCase ( action Queue ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġa Ġuse Ġcase Ġthat Ġwill Ġexecute Ġafter Ġprevious Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrun Ġfunction Ġfor Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġmapping Ġfunction Ġthat Ġmapping Ġprevious Ġmodel Ġuse Ġcase Ġresult Ġwith Ġparams Ġfor Ġthis ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Builder ] Ġinstance ĊĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< Model Ġ: ĠAny , ĠParams UseCase Ġ: ĠAction Params > Ġadd UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun : Ġ( Params UseCase ) Ġ-> ĠEither < Failure , ĠModel >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapping : Ġ( Old Model ) Ġ-> ĠParams UseCase ĊĠĠĠĠĠĠĠ Ġ): ĠAction Queue Builder UseCase < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= Ġobject Ġ: ĠUse Case < Model , ĠParams UseCase >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġrun ( params : ĠParams UseCase ): ĠEither < Failure , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun . invoke ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Queue . use Case Queue . add ( Action Queue Item ( use Case , Ġmapping )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction Queue Builder UseCase ( action Queue ) ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe Ġlast Ġuse Ġcase Ġthat Ġwill Ġexecute Ġwith Ġthe Ġfunction Ġdefine Ġin Ġ[ mapping Function ] ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġuse Case Class Ġjava Ġclass Ġof Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġmapping Ġfunction Ġthat Ġmapping Ġprevious Ġmodel Ġuse Ġcase Ġresult Ġwith Ġparams Ġfor Ġthis ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Builder ] Ġinstance ĊĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġ< Params UseCase Ġ: ĠAction Params , ĠModel Ġ: ĠAny , ĠT Ġ: ĠUse Case < Model , ĠParams UseCase >> Ġset Last UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case Class : ĠClass < T >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapping : Ġ( Old Model ) Ġ-> ĠParams UseCase ĊĠĠĠĠĠĠĠ Ġ): ĠAction Queue Builder Mapping Ui Model < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Action Queue Ġ= ĠAction Queue < Params , ĠUi Model , ĠModel >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Action Queue . last UseCase Ġ= ĠAction Queue Item ( use Case Class . newInstance (), Ġmapping ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Action Queue . use Case Queue . addAll ( action Queue . use Case Queue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction Queue Builder Mapping Ui Model ( final Action Queue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe Ġlast Ġuse Ġcase Ġthat Ġwill Ġexecute Ġwith Ġthe Ġfunction Ġdefine Ġin Ġ[ mapping Function ] ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġuse Case Class Ġinstance Ġof Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġmapping Ġfunction Ġthat Ġmapping Ġprevious Ġmodel Ġuse Ġcase Ġresult Ġwith Ġparams Ġfor Ġthis ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Builder ] Ġinstance ĊĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġ< Params UseCase Ġ: ĠAction Params , ĠModel Ġ: ĠAny , ĠT Ġ: ĠUse Case < Model , ĠParams UseCase >> Ġset Last UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case Class : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapping : Ġ( Old Model ) Ġ-> ĠParams UseCase ĊĠĠĠĠĠĠĠ Ġ): ĠAction Queue Builder Mapping Ui Model < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Action Queue Ġ= ĠAction Queue < Params , ĠUi Model , ĠModel >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Action Queue . last UseCase Ġ= ĠAction Queue Item ( use Case Class , Ġmapping ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Action Queue . use Case Queue . addAll ( action Queue . use Case Queue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction Queue Builder Mapping Ui Model ( final Action Queue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe Ġlast Ġuse Ġcase Ġthat Ġwill Ġexecute Ġwith Ġthe Ġfunction Ġdefine Ġin Ġ[ mapping Function ] ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrun Ġfunction Ġfor Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġmapping Ġfunction Ġthat Ġmapping Ġprevious Ġmodel Ġuse Ġcase Ġresult Ġwith Ġparams Ġfor Ġthis ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Action Queue Builder ] Ġinstance ĊĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< Model Ġ: ĠAny , ĠParams UseCase Ġ: ĠAction Params > Ġset Last UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun : Ġ( Params UseCase ) Ġ-> ĠEither < Failure , ĠModel >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapping : Ġ( Old Model ) Ġ-> ĠParams UseCase ĊĠĠĠĠĠĠĠ Ġ): ĠAction Queue Builder Mapping Ui Model < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= Ġobject Ġ: ĠUse Case < Model , ĠParams UseCase >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġrun ( params : ĠParams UseCase ): ĠEither < Failure , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun . invoke ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Action Queue Ġ= ĠAction Queue < Params , ĠUi Model , ĠModel >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Action Queue . last UseCase Ġ= ĠAction Queue Item ( use Case , Ġmapping ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Action Queue . use Case Queue . addAll ( action Queue . use Case Queue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction Queue Builder Mapping Ui Model ( final Action Queue ) ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġthis Ġclass Ġfor Ġcreate Ġa Ġinstance Ġof Ġ[ Action Queue ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠBuilder < Params Ġ: ĠAction Params , ĠUi Model Ġ: ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaction Queue Ġ= ĠAction Queue < Params , ĠUi Model , ĠAny >() ĊĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe Ġfirst Ġuse Ġcase Ġthat Ġwill Ġexecute ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġuse Case Class Ġjava Ġclass Ġof Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Builder ] Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġ< Model Ġ: ĠAny , ĠT Ġ: ĠUse Case < Model , ĠParams >> Ġset First UseCase ( use Case Class : ĠClass < T >): ĠAction Queue Builder UseCase < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Queue . use Case Queue . add ( 0 , ĠAction Queue Item < Params , ĠModel , ĠModel >( use Case Class . newInstance ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction Queue Builder UseCase ( action Queue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe Ġfirst Ġuse Ġcase Ġthat Ġwill Ġexecute ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġuse Case Class Ġjava Ġclass Ġof Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Builder ] Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< Model Ġ: ĠAny , ĠT Ġ: ĠUse Case < Model , ĠParams >> Ġset First UseCase ( use Case Class : ĠT ): ĠAction Queue Builder UseCase < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Queue . use Case Queue . add ( 0 , ĠAction Queue Item < Params , ĠModel , ĠModel >( use Case Class )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction Queue Builder UseCase ( action Queue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe Ġfirst Ġuse Ġcase Ġthat Ġwill Ġexecute ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrun Ġfunction Ġfor Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Builder ] Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< Model Ġ: ĠAny > Ġset First UseCase ( run : Ġ( Params ) Ġ-> ĠEither < Failure , ĠModel >): ĠAction Queue Builder UseCase < Params , ĠUi Model , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= Ġobject Ġ: ĠUse Case < Model , ĠParams >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġrun ( params : ĠParams ): ĠEither < Failure , ĠModel > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun . invoke ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Queue . use Case Queue . add ( 0 , ĠAction Queue Item < Params , ĠModel , ĠModel >( use Case )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction Queue Builder UseCase ( action Queue ) ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} Ċ }