package Ġdev . te ap ot . extensions . cache dp aging Ċ Ċ import Ġdev . te ap ot . extensions . paging . Log Throwable Cmd Ċ import Ġdev . te ap ot . cmd . Batch Cmd Ċ import Ġdev . te ap ot . cmd . Cmd Ċ import Ġdev . te ap ot . contract . Plug gable Feature Ċ import Ġdev . te ap ot . contract . Rx Effect Handler Ċ import Ġdev . te ap ot . contract . Update Ċ import Ġdev . te ap ot . log . Te ap ot Logger Ċ import Ġdev . te ap ot . msg . Msg Ċ import Ġdev . te ap ot . state less Effect Ċ import Ġio . reactivex . Single Ċ Ċ /** Ċ Ġ* ĠFor Ġcached Ġpaging Ġwe Ġhave Ġ 2 Ġside Ġeffect - requests Ġ- Ċ Ġ* Ġ 1 . ĠRequest Ġfor Ġitems Ġin Ġcache Ċ Ġ* Ġ 2 . ĠRequest Ġfor Ġitems Ġin Ġserver Ċ Ġ* Ċ Ġ* ĠAlgorithm Ġfor Ġpaging Ġwith Ġcache : Ċ Ġ* Ċ Ġ* ĠLet 's Ġassume Ġwe Ġhave Ġ 3 Ġpages Ġof Ġelements Ċ Ġ* Ġ 1 . ĠOn Ġinitial Ġstep Ġwe Ġdo Ġtwo Ġparallel Ġrequests Ġfor Ġ 1 st Ġpage Ġof Ġcache Ġand Ġ 1 st Ġpage Ġfor Ġserver Ċ Ġ* Ġ 2 . ĠOnce Ġcache Ġreceived , Ġwe Ġshow Ġit . Ċ Ġ* ĠBase Ġidea Ġis Ġthat Ġwe Ġdo Ġnot Ġwait Ġfor Ġresponse Ġof Ġsync ing Ġrequest . ĠUser Ġcan Ġscroll Ġdown Ġstart Ġto Ġload Ġnext Ġpages Ċ Ġ* Ġof Ġcache . Ċ Ġ* Ġ 3 . ĠSync Ġresponse Ġar rived , Ġwe Ġsave Ġitems Ġto Ġcache , Ġand Ġsending Ġanother Ġrequest Ġto Ġ 1 st Ġcache Ġof Ġcache Ċ Ġ* Ġ 4 . ĠF resh Ġitems Ġfrom Ġcache Ġar rive Ċ Ġ* Ġ 5 . ĠUser Ġscroll s Ġdown Ġto Ġthe Ġbottom Ġand Ġwe Ġcreate Ġanother Ġtwo Ġrequests Ġ- Ġ 1 Ġand Ġ 2 Ġpage Ġof Ġcache , Ġand Ġsync Ġrequest Ċ Ġ* Ġfor Ġ 2 nd Ġpage Ċ Ġ* Ġ 6 . ĠShow Ġcache Ġ 2 Ġpages Ġof Ġcache Ċ Ġ* Ġ 7 . ĠOnce Ġsync Ġresponse Ġar rives , Ġagain Ġcreate Ġrequest Ġfor Ġ 1 Ġand Ġ 2 Ġpages Ġof Ġcache Ċ Ġ* Ġ 8 . ĠUser Ġscroll s Ġdown Ġto Ġthe Ġbottom Ġand Ġwe Ġcreate Ġanother Ġtwo Ġrequests Ġ- Ġ 1 Ġand Ġ 2 Ġand Ġ 3 Ġpage Ġof Ġcache , Ċ Ġ* Ġand Ġsync Ġrequest Ġfor Ġ 3 nd Ġpage Ċ Ġ* Ġ 9 . ĠShow Ġ 3 Ġpages Ġof Ġcache Ċ Ġ* Ġ 7 . ĠOnce Ġsync Ġresponse Ġar rives , Ġagain Ġcreate Ġrequest Ġfor Ġ 1 Ġand Ġ 2 Ġand Ġ 3 Ġpages Ġof Ġcache Ċ Ġ* Ġ 8 . ĠShow Ġ 3 Ġpages Ġof Ġcache Ġand Ġthat 's Ġall Ċ Ġ*/ Ċ Ċ class ĠCached Paging Feature < T , ĠFETCH _ PARAMS >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcmd Handler Paging : ĠCached Paging Commands Handler < T , ĠFETCH _ PARAMS >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠpageSize : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġerror Logger : ĠTe ap ot Logger ? Ġ= Ġnull Ċ ) Ġ: ĠPlug gable Feature < Cached Paging State < T , ĠFETCH _ PARAMS >, ĠFETCH _ PARAMS >, ĠRx Effect Handler Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmessages Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠCached Paging Start Msg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging Start With Params Msg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging On Sc rolled ToEnd Msg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging Items Loaded From Cache Msg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging Sync ed Items Msg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging On Retry List Button Click Msg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging On Retry After Error Button Click Msg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging Sync After ErrorMsg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging On Swipe Msg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging ErrorMsg :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging Reload Cache Msg :: class ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġcommands Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠCached Paging Load Items From Cache Cmd :: class , ĊĠĠĠĠĠĠĠ ĠCached Paging Sync Items Cmd :: class , ĊĠĠĠĠĠĠĠ ĠLog Throwable Cmd :: class ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠinitialState ( initial Params Ġ: ĠFETCH _ PARAMS ): ĠCached Paging State < T , ĠFETCH _ PARAMS > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCached Paging State ( fetch Params Ġ= Ġinitial Params , ĠpageSize Ġ= ĠpageSize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandles Message ( msg : ĠMsg ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmessages . contains ( msg :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandles Commands ( cmd : ĠCmd ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcommands . contains ( cmd :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Unsafe Cast ", Ġ" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġupdate ( ĊĠĠĠĠĠĠĠ Ġmsg : ĠMsg , ĊĠĠĠĠĠĠĠ Ġstate : ĠCached Paging State < T , ĠFETCH _ PARAMS > ĊĠĠĠ Ġ): ĠUpdate < Cached Paging State < T , ĠFETCH _ PARAMS >> Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( msg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging Start Msg Ġ-> Ġstart Paging ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging Start With Params Msg < *, Ġ*> Ġ-> Ġstart Paging ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . params Ġas ? ĠFETCH _ PARAMS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging On Sc rolled ToEnd Msg Ġ-> Ġload Next Page ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging Items Loaded From Cache Msg < *> Ġ-> Ġitems Loaded From Cache ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . items Ġas ĠList < T >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . limit Requested ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging Sync ed Items Msg Ġ-> ĠUpdate . update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sync ing Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cache Loading Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pages Ġ= Ġmsg . total Pages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠCached Paging Load Items From Cache Cmd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( state . next Page Ġ- Ġ 1 ) Ġ* Ġstate . pageSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . fetch Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging On Retry List Button Click Msg Ġ-> Ġload Next Page ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging Sync After ErrorMsg Ġ-> ĠUpdate . update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Sync Error Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sync ing Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cache Loading Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Refresh ing Enabled Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Refresh ing Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠCached Paging Sync Items Cmd ( 1 , Ġstate . pageSize , Ġstate . fetch Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging On Retry After Error Button Click Msg Ġ-> Ġstart Paging ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging On Swipe Msg Ġ-> ĠUpdate . update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . to Refresh ing State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sync ing Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cache Loading Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠBatch Cmd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCached Paging Load Items From Cache Cmd ( 1 Ġ* Ġstate . pageSize , Ġstate . fetch Params ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCached Paging Sync Items Cmd ( 1 , Ġstate . pageSize , Ġstate . fetch Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging ErrorMsg Ġ-> ĠonError Msg ( msg , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCached Paging Reload Cache Msg Ġ-> ĠUpdate . update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . copy ( is Cache Loading Ġ= Ġtrue ), ĠCached Paging Load Items From Cache Cmd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( state . next Page Ġ- Ġ 1 ) Ġ* Ġstate . pageSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . fetch Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġmessage Ġ$ msg ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Paging ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠCached Paging State < T , ĠFETCH _ PARAMS >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Params : ĠFETCH _ PARAMS ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠUpdate < Cached Paging State < T , ĠFETCH _ PARAMS >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state . is Cache Loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUpdate . idle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠUpdate . update ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Sync Error Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sync ing Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cache Loading Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Started Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Params Ġ= Ġfetch Params Ġ?: Ġstate . fetch Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠBatch Cmd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCached Paging Load Items From Cache Cmd ( state . next Page Ġ* Ġstate . pageSize , Ġstate . fetch Params ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCached Paging Sync Items Cmd ( state . next Page , Ġstate . pageSize , Ġstate . fetch Params ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Unsafe Cast ", Ġ" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġitems Loaded From Cache ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠCached Paging State < T , ĠFETCH _ PARAMS >, Ġitems : ĠList < T >, Ġlimit Requested : ĠInt ĊĠĠĠ Ġ): ĠUpdate < Cached Paging State < T , ĠFETCH _ PARAMS >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Result For First Page Ġ= Ġlimit Requested Ġ== Ġstate . pageSize ĊĠĠĠĠĠĠĠ Ġval Ġis No More Cache Ġ= Ġitems . size Ġ< Ġlimit Requested ĊĊĠĠĠĠĠĠĠ Ġreturn ĠUpdate . state ( state . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . isEmpty () Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sync ing Ġ-> Ġto Fullscreen Loading State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Sync Error Ġ-> Ġto Fullscreen Error State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġto No Items State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Sync Error Ġ&& Ġis No More Cache Ġ-> Ġto List State With Sync Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Sync Error Ġ-> Ġto Loading State With Sync Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sync ing Ġ&& Ġis Result For First Page Ġ-> Ġif Ġ( items . size Ġ== Ġstate . pageSize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Refresh ing State With Spinner () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġto Refresh ing State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sync ing Ġ-> Ġto Page Loading State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pages Ġ!= Ġnull Ġ&& Ġnext Page Ġ> Ġtotal Pages Ġ-> Ġto Comp let ely Loaded State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġto Page Loading State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. copy ( is Cache Loading Ġ= Ġfalse , Ġis No More Cache Ġ= Ġis No More Cache , Ġitems Ġ= Ġitems )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Unsafe Cast ") ĊĠĠĠ Ġoverride Ġfun Ġcall ( cmd : ĠCmd ): ĠSingle < Msg > Ġ= Ġwhen Ġ( cmd ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠCached Paging Load Items From Cache Cmd < *> Ġ-> Ġcmd Handler Paging . get Cached Items ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd . limit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd . params Ġas ĠFETCH _ PARAMS ĊĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCached Paging Items Loaded From Cache Msg ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . items , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd . limit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠMsg ĊĠĠĠĠĠĠĠ Ġ}. onError Resume Next Ġ{ ĠSingle . just ( Cached Paging ErrorMsg ( it , Ġcmd )) Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠCached Paging Sync Items Cmd < *> Ġ-> Ġcmd Handler Paging . fetch Page ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd . page , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd . pageSize , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd . params Ġas ĠFETCH _ PARAMS ĊĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCached Paging Sync ed Items Msg ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd . page , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . total Pages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠMsg ĊĠĠĠĠĠĠĠ Ġ}. onError Resume Next Ġ{ ĠSingle . just ( Cached Paging ErrorMsg ( it , Ġcmd )) Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠLog Throwable Cmd Ġ-> Ġstate less Effect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Logger ?. error (" Cached Paging State ", Ġcmd . error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġmessage Ġ$ cmd ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonError Msg ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg : ĠCached Paging ErrorMsg , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠCached Paging State < T , ĠFETCH _ PARAMS > ĊĠĠĠ Ġ) Ġ= Ġwhen Ġ( msg . cmd ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠCached Paging Load Items From Cache Cmd < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate . update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . items . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . to Fullscreen Error State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . to Retry Page State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Ġ= Ġstate . next Page . dec (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cache Loading Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠLog Throwable Cmd ( msg . err ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠCached Paging Sync Items Cmd < *> Ġ-> ĠUpdate . update ( state . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . isEmpty () Ġ&& Ġis Cache Loading Ġ-> Ġto Fullscreen Loading State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . isEmpty () Ġ-> Ġto Fullscreen Error State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . size Ġ< ĠpageSize Ġ-> Ġto List State With Sync Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġto Loading State With Sync Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. copy ( is Sync ing Ġ= Ġfalse , Ġhas Sync Error Ġ= Ġtrue ), ĠLog Throwable Cmd ( msg . err )) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Can 't Ġhandle Ġmsg Ġ$ msg ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġload Next Page ( state : ĠCached Paging State < T , ĠFETCH _ PARAMS >): ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate < Cached Paging State < T , ĠFETCH _ PARAMS >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state . is Cache Loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUpdate . idle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠUpdate . update ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . to Page Loading State (). copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Ġ= Ġstate . next Page . inc (), Ġis Cache Loading Ġ= Ġtrue , Ġis Sync ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠBatch Cmd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCached Paging Load Items From Cache Cmd ( state . next Page Ġ* Ġstate . pageSize , Ġstate . fetch Params ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCached Paging Sync Items Cmd ( state . next Page , Ġstate . pageSize , Ġstate . fetch Params ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }