package Ġcom . me u us 9 0 . zz im . model . source . remote . paging Ċ Ċ import Ġandroidx . paging . Paging Source Ċ import Ġandroidx . paging . Paging State Ċ import Ġcom . me u us 9 0 . zz im . model . data . Goods DataModel Ċ import Ġcom . me u us 9 0 . zz im . model . source . remote . api . Rest API Ċ Ċ class ĠProduct Paging Source ( private Ġval Ġrest API : ĠRest API ) Ġ: ĠP aging Source < Int , ĠGood s DataModel >() Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ MESSAGE _ P AGING _ END Ġ= Ġ" Paging ĠEnd " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġis End Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠGood s DataModel > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . key Ġ== Ġnull Ġ|| Ġparams . key Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhome Ġ= Ġrest API . get Home () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( home . goods . isEmpty ()) Ġis End Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf < Goods DataModel >( Goods DataModel . Header ( home . b anners )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( home . goods . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGood s DataModel . Item ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġlist . last OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġlist , Ġprev Key Ġ= Ġnull , Ġnext Key Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Ġis ĠGood s DataModel . Item ) Ġlast . goods . id Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhome Ġ= Ġrest API . getNext Goods ( params . key !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( home . goods . isEmpty ()) Ġis End Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġhome . goods . map Ġ{ ĠGood s DataModel . Item ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġlist . last OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġlist , Ġprev Key Ġ= Ġnull , Ġnext Key Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Ġis ĠGood s DataModel . Item ) Ġlast . goods . id Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Error ( Throwable ( ERROR _ MESSAGE _ P AGING _ END )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠGood s DataModel >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġis End Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} Ċ }