/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . paging Ċ Ċ import Ġandroidx . arch . core . util . Function Ċ import Ġandroidx . paging . DataSource . KeyType . PAGE _ KEY ED Ċ import Ġandroidx . paging . Page Key ed DataSource . Result Ċ import Ġkotlinx . coroutines . C ancellable Continuation Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . resume With Exception Ċ Ċ /** Ċ Ġ* ĠIncrement al Ġdata Ġloader Ġfor Ġpage - keyed Ġcontent , Ġwhere Ġrequests Ġreturn Ġkeys Ġfor Ġnext / previous Ċ Ġ* Ġpages . Ċ Ġ* Ċ Ġ* ĠImplement Ġa Ġ[ DataSource ] Ġusing Ġ[ Page Key ed DataSource ] Ġif Ġyou Ġneed Ġto Ġuse Ġdata Ġfrom Ġpage Ġ` N Ġ- Ġ 1 ` Ġto Ċ Ġ* Ġload Ġpage Ġ` N `. ĠThis Ġis Ġcommon , Ġfor Ġexample , Ġin Ġnetwork ĠAPIs Ġthat Ġinclude Ġa Ġnext / previous Ġlink Ġor Ċ Ġ* Ġkey Ġwith Ġeach Ġpage Ġload . Ċ Ġ* Ċ Ġ* ĠThe Ġ` InMemory By Page Repository ` Ġin Ġthe Ċ Ġ* Ġ[ Paging With Network Sample ]( https :// github . com / google samples / android - architecture - components / blob / master / Paging With Network Sample / README . md ) Ċ Ġ* Ġshows Ġhow Ġto Ġimplement Ġa Ġnetwork ĠPage Key ed DataSource Ġusing Ċ Ġ* Ġ[ Ret rofit ]( https :// square . github . io / ret rofit /), Ġwhile Ċ Ġ* Ġhandling Ġswipe - to - refresh , Ġnetwork Ġerrors , Ġand Ġretry . Ċ Ġ* Ċ Ġ* Ġ@ param ĠKey ĠType Ġof Ġdata Ġused Ġto Ġquery ĠValue Ġtypes Ġout Ġof Ġthe Ġ[ DataSource ]. Ċ Ġ* Ġ@ param ĠValue ĠType Ġof Ġitems Ġbeing Ġloaded Ġby Ġthe Ġ[ DataSource ]. Ċ Ġ*/ Ċ abstract Ġclass ĠPage Key ed DataSource < Key Ġ: ĠAny , ĠValue Ġ: ĠAny > Ġ: ĠDataSource < Key , ĠValue >( PAGE _ KEY ED ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠH older Ġobject Ġfor Ġinputs Ġto Ġ[ load Initial ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠKey ĠType Ġof Ġdata Ġused Ġto Ġquery Ġpages . ĊĠĠĠĠ Ġ* Ġ@ property Ġrequested Load Size ĠRequest ed Ġnumber Ġof Ġitems Ġto Ġload . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġmay Ġbe Ġlarger Ġthan Ġavailable Ġdata . ĊĠĠĠĠ Ġ* Ġ@ property Ġplaceholders Enabled ĠDefines Ġwhether Ġplaceholders Ġare Ġenabled , Ġand Ġwhether Ġthe ĊĠĠĠĠ Ġ* Ġloaded Ġtotal Ġcount Ġwill Ġbe Ġignored . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġclass ĠLoad Initial Params < Key Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval Ġrequested Load Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval Ġplaceholders Enabled : ĠBoolean ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠH older Ġobject Ġfor Ġinputs Ġto Ġ[ load Before ] Ġand Ġ[ load After ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠKey ĠType Ġof Ġdata Ġused Ġto Ġquery Ġpages . ĊĠĠĠĠ Ġ* Ġ@ property Ġkey ĠLoad Ġitems Ġbefore / after Ġthis Ġkey . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturned Ġdata Ġmust Ġbegin Ġdirectly Ġadjacent Ġto Ġthis Ġposition . ĊĠĠĠĠ Ġ* Ġ@ property Ġrequested Load Size ĠRequest ed Ġnumber Ġof Ġitems Ġto Ġload . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturned Ġpage Ġcan Ġbe Ġof Ġthis Ġsize , Ġbut Ġit Ġmay Ġbe Ġaltered Ġif Ġthat Ġis Ġeasier , Ġe . g . Ġa Ġnetwork ĊĠĠĠĠ Ġ* Ġdata Ġsource Ġwhere Ġthe Ġbackend Ġdefines Ġpage Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġclass ĠLoad Params < Key Ġ: ĠAny >( @ Jvm Field Ġval Ġkey : ĠKey , Ġ@ Jvm Field Ġval Ġrequested Load Size : ĠInt ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠType Ġproduced Ġby Ġ[ load Initial ] Ġto Ġrepresent Ġinitially Ġloaded Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠKey ĠType Ġof Ġkey Ġused Ġto Ġidentify Ġpages . ĊĠĠĠĠ Ġ* Ġ@ param ĠValue ĠType Ġof Ġitems Ġbeing Ġloaded Ġby Ġthe Ġ[ DataSource ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġclass ĠInitial Result < Key Ġ: ĠAny , ĠValue Ġ: ĠAny > Ġ: ĠBase Result < Value > Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠList < Value >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Page Key : ĠKey ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Key : ĠKey ? ĊĠĠĠĠĠĠĠ Ġ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Page Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Count Ġ- Ġdata . size Ġ- Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġconstructor ( data : ĠList < Value >, Ġprevious Page Key : ĠKey ?, Ġnext Page Key : ĠKey ?) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper ( data , Ġprevious Page Key , Ġnext Page Key , Ġ 0 , Ġ 0 , Ġ 0 , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠType Ġproduced Ġby Ġ[ load Before ] Ġand Ġ[ load After ] Ġto Ġrepresent Ġa Ġpage Ġof Ġloaded Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠKey ĠType Ġof Ġkey Ġused Ġto Ġidentify Ġpages . ĊĠĠĠĠ Ġ* Ġ@ param ĠValue ĠType Ġof Ġitems Ġbeing Ġloaded Ġby Ġthe Ġ[ DataSource ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġclass ĠResult < Key Ġ: ĠAny , ĠValue Ġ: ĠAny >( data : ĠList < Value >, Ġadjacent Page Key : ĠKey ?) Ġ: ĊĠĠĠĠĠĠĠ ĠDataSource . Base Result < Value >( data , Ġadjacent Page Key , Ġadjacent Page Key , Ġ 0 , Ġ 0 , Ġ 0 , Ġfalse ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCallback Ġfor Ġ[ load Initial ] Ġto Ġreturn Ġdata Ġand , Ġoptionally , Ġposition / count Ġinformation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġcallback Ġcan Ġbe Ġcalled Ġonly Ġonce , Ġand Ġwill Ġthrow Ġif Ġcalled Ġagain . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġyou Ġcan Ġcompute Ġthe Ġnumber Ġof Ġitems Ġin Ġthe Ġdata Ġset Ġbefore Ġand Ġafter Ġthe Ġloaded Ġrange , ĊĠĠĠĠ Ġ* Ġcall Ġthe Ġfive Ġparameter Ġ[ on Result ] Ġto Ġpass Ġthat Ġinformation . ĠYou Ġcan Ġskip Ġpassing Ġthis ĊĠĠĠĠ Ġ* Ġinformation Ġby Ġcalling Ġthe Ġthree Ġparameter Ġ[ on Result ], Ġeither Ġif Ġit 's Ġdifficult Ġto Ġcompute , ĊĠĠĠĠ Ġ* Ġor Ġif Ġ[ Load Initial Params . placeholders Enabled ] Ġis Ġ` false `, Ġso Ġthe Ġposition ing Ġinformation Ġwill ĊĠĠĠĠ Ġ* Ġbe Ġignored . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġis Ġalways Ġvalid Ġfor Ġa ĠDataSource Ġloading Ġmethod Ġthat Ġtakes Ġa Ġcallback Ġto Ġst ash Ġthe ĊĠĠĠĠ Ġ* Ġcallback Ġand Ġcall Ġit Ġlater . ĠThis Ġenables ĠData Sources Ġto Ġbe Ġfully Ġasynchronous , Ġand Ġto Ġhandle ĊĠĠĠĠ Ġ* Ġtemporary , Ġrecover able Ġerror Ġstates Ġ( such Ġas Ġa Ġnetwork Ġerror Ġthat Ġcan Ġbe Ġretried ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠKey ĠType Ġof Ġdata Ġused Ġto Ġquery Ġpages . ĊĠĠĠĠ Ġ* Ġ@ param ĠValue ĠType Ġof Ġitems Ġbeing Ġloaded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġclass ĠLoad Initial Callback < Key , ĠValue > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġto Ġpass Ġinitial Ġload Ġstate Ġfrom Ġa ĠDataSource . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġfrom Ġyour ĠDataSource 's Ġ` load Initial ` Ġfunction Ġto Ġreturn Ġdata , ĊĠĠĠĠĠĠĠĠ Ġ* Ġand Ġinform Ġhow Ġmany Ġplaceholders Ġshould Ġbe Ġshown Ġbefore Ġand Ġafter . ĠIf Ġcounting Ġis Ġche ap ĊĠĠĠĠĠĠĠĠ Ġ* Ġto Ġcompute Ġ( for Ġexample , Ġif Ġa Ġnetwork Ġload Ġreturns Ġthe Ġinformation Ġregardless ), Ġit 's ĊĠĠĠĠĠĠĠĠ Ġ* Ġrecommended Ġto Ġpass Ġdata Ġback Ġthrough Ġthis Ġmethod . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIt Ġis Ġalways Ġvalid Ġto Ġpass Ġa Ġdifferent Ġamount Ġof Ġdata Ġthan Ġwhat Ġis Ġrequested . ĠPass Ġan ĊĠĠĠĠĠĠĠĠ Ġ* Ġempty Ġlist Ġif Ġthere Ġis Ġno Ġmore Ġdata Ġto Ġload . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata ĠList Ġof Ġitems Ġloaded Ġfrom Ġthe Ġ[ DataSource ]. ĠIf Ġthis Ġis Ġempty , Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ DataSource ] Ġis Ġtreated Ġas Ġempty , Ġand Ġno Ġfurther Ġloads Ġwill Ġoccur . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġposition ĠPosition Ġof Ġthe Ġitem Ġat Ġthe Ġfront Ġof Ġthe Ġlist . ĠIf Ġthere Ġare Ġ` N ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġitems Ġbefore Ġthe Ġitems Ġin Ġdata Ġthat Ġcan Ġbe Ġloaded Ġfrom Ġthis ĠDataSource , Ġpass Ġ` N `. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtotal Count ĠTotal Ġnumber Ġof Ġitems Ġthat Ġmay Ġbe Ġreturned Ġfrom Ġthis ĠDataSource . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIncludes Ġthe Ġnumber Ġin Ġthe Ġinitial Ġ` data ` Ġparameter Ġas Ġwell Ġas Ġany Ġitems Ġthat Ġcan Ġbe ĊĠĠĠĠĠĠĠĠ Ġ* Ġloaded Ġin Ġfront Ġor Ġbehind Ġof Ġ` data `. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠList < Value >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Page Key : ĠKey ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Key : ĠKey ? ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġto Ġpass Ġloaded Ġdata Ġfrom Ġa ĠDataSource . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCall Ġthis Ġfrom Ġ[ load Initial ] Ġto Ġinitialize Ġwithout Ġcounting Ġavailable Ġdata , Ġor Ġsupporting ĊĠĠĠĠĠĠĠĠ Ġ* Ġplaceholders . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIt Ġis Ġalways Ġvalid Ġto Ġpass Ġa Ġdifferent Ġamount Ġof Ġdata Ġthan Ġwhat Ġis Ġrequested . ĠPass Ġan ĊĠĠĠĠĠĠĠĠ Ġ* Ġempty Ġlist Ġif Ġthere Ġis Ġno Ġmore Ġdata Ġto Ġload . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata ĠList Ġof Ġitems Ġloaded Ġfrom Ġthe Ġ[ Page Key ed DataSource ]. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġprevious Page Key ĠKey Ġfor Ġpage Ġbefore Ġthe Ġinitial Ġload Ġresult , Ġor Ġ` null ` Ġif Ġno Ġmore ĊĠĠĠĠĠĠĠĠ Ġ* Ġdata Ġcan Ġbe Ġloaded Ġbefore . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġnext Page Key ĠKey Ġfor Ġpage Ġafter Ġthe Ġinitial Ġload Ġresult , Ġor Ġ` null ` Ġif Ġno Ġmore Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* Ġcan Ġbe Ġloaded Ġafter . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Result ( data : ĠList < Value >, Ġprevious Page Key : ĠKey ?, Ġnext Page Key : ĠKey ?) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġto Ġreport Ġan Ġerror Ġfrom Ġa ĠDataSource . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġto Ġreport Ġan Ġerror Ġfrom Ġ[ load Initial ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġerror ĠThe Ġerror Ġthat Ġoccurred Ġduring Ġloading . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġopen Ġfun ĠonError ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġremove Ġdefault Ġimplementation Ġin Ġ 3 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġmust Ġimplement ĠonError Ġif Ġimplementing Ġyour Ġown Ġload Ġcallback " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCallback Ġfor Ġ[ load Before ] Ġand Ġ[ load After ] Ġto Ġreturn Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġcallback Ġcan Ġbe Ġcalled Ġonly Ġonce , Ġand Ġwill Ġthrow Ġif Ġcalled Ġagain . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġis Ġalways Ġvalid Ġfor Ġa ĠDataSource Ġloading Ġmethod Ġthat Ġtakes Ġa Ġcallback Ġto Ġst ash Ġthe ĊĠĠĠĠ Ġ* Ġcallback Ġand Ġcall Ġit Ġlater . ĠThis Ġenables ĠData Sources Ġto Ġbe Ġfully Ġasynchronous , Ġand Ġto Ġhandle ĊĠĠĠĠ Ġ* Ġtemporary , Ġrecover able Ġerror Ġstates Ġ( such Ġas Ġa Ġnetwork Ġerror Ġthat Ġcan Ġbe Ġretried ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠKey ĠType Ġof Ġdata Ġused Ġto Ġquery Ġpages . ĊĠĠĠĠ Ġ* Ġ@ param ĠValue ĠType Ġof Ġitems Ġbeing Ġloaded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġclass ĠLoad Callback < Key , ĠValue > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġto Ġpass Ġloaded Ġdata Ġfrom Ġa Ġ[ DataSource ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġfrom Ġyour ĠPage Key ed DataSource 's Ġ[ load Before ] Ġand Ġ[ load After ] Ġmethods Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġreturn Ġdata . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIt Ġis Ġalways Ġvalid Ġto Ġpass Ġa Ġdifferent Ġamount Ġof Ġdata Ġthan Ġwhat Ġis Ġrequested . ĠPass Ġan ĊĠĠĠĠĠĠĠĠ Ġ* Ġempty Ġlist Ġif Ġthere Ġis Ġno Ġmore Ġdata Ġto Ġload . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠPass Ġthe Ġkey Ġfor Ġthe Ġsubsequent Ġpage Ġto Ġload Ġto Ġadjacent Page Key . ĠFor Ġexample , Ġif Ġyou 've ĊĠĠĠĠĠĠĠĠ Ġ* Ġloaded Ġa Ġpage Ġin Ġ[ load Before ], Ġpass Ġthe Ġkey Ġfor Ġthe Ġprevious Ġpage , Ġor Ġ` null ` Ġif Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġloaded Ġpage Ġis Ġthe Ġfirst . ĠIf Ġin Ġ[ load After ], Ġpass Ġthe Ġkey Ġfor Ġthe Ġnext Ġpage , Ġor Ġ` null ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġif Ġthe Ġloaded Ġpage Ġis Ġthe Ġlast . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata ĠList Ġof Ġitems Ġloaded Ġfrom Ġthe ĠPage Key ed DataSource . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġadjacent Page Key ĠKey Ġfor Ġsubsequent Ġpage Ġload Ġ( previous Ġpage Ġin Ġ[ load Before ] Ġ/ Ġnext ĊĠĠĠĠĠĠĠĠ Ġ* Ġpage Ġin Ġ[ load After ]), Ġor Ġ` null ` Ġif Ġthere Ġare Ġno Ġmore Ġpages Ġto Ġload Ġin Ġthe Ġcurrent Ġload ĊĠĠĠĠĠĠĠĠ Ġ* Ġdirection . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Result ( data : ĠList < Value >, Ġadjacent Page Key : ĠKey ?) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġto Ġreport Ġan Ġerror Ġfrom Ġa ĠDataSource . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġto Ġreport Ġan Ġerror Ġfrom Ġyour ĠPage Key ed DataSource 's Ġ[ load Before ] Ġand ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ load After ] Ġmethods . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġerror ĠThe Ġerror Ġthat Ġoccurred Ġduring Ġloading . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġopen Ġfun ĠonError ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġremove Ġdefault Ġimplementation Ġin Ġ 3 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġmust Ġimplement ĠonError Ġif Ġimplementing Ġyour Ġown Ġload Ġcallback " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ throws Ġ[ IllegalArgumentException ] Ġwhen Ġpassed Ġan Ġunsupported Ġload Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Red undant Visibility Modifier ") Ġ// ĠMet al ava Ġdoesn 't Ġinherit Ġvisibility Ġproperly . ĊĠĠĠ Ġinternal Ġfinal Ġoverride Ġsuspend Ġfun Ġload ( params : ĠParams < Key >): ĠBase Result < Value > Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġparams . type Ġ== ĠLoad Type . INITIAL Ġ-> Ġload Initial ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Initial Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . initial Load Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . placeholders Enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġparams . key Ġ== Ġnull Ġ-> ĠBase Result . empty () ĊĠĠĠĠĠĠĠ Ġparams . type Ġ== ĠLoad Type . START Ġ-> Ġload Before ( Load Params ( params . key , Ġparams . pageSize )) ĊĠĠĠĠĠĠĠ Ġparams . type Ġ== ĠLoad Type . END Ġ-> Ġload After ( Load Params ( params . key , Ġparams . pageSize )) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġtype Ġ" Ġ+ Ġparams . type . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Initial ( params : ĠLoad Initial Params < Key >) Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine < Initial Result < Key , ĠValue >> Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Initial ( params , Ġobject Ġ: ĠLoad Initial Callback < Key , ĠValue >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠList < Value >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Page Key : ĠKey ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Key : ĠKey ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInitial Result ( data , Ġposition , Ġtotal Count , Ġprevious Page Key , Ġnext Page Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( initial Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Result ( data : ĠList < Value >, Ġprevious Page Key : ĠKey ?, Ġnext Page Key : ĠKey ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( Initial Result ( data , Ġprevious Page Key , Ġnext Page Key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With Exception ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Before ( params : ĠLoad Params < Key >) Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine < Result < Key , ĠValue >> Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Before ( params , Ġcont . as Callback ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload After ( params : ĠLoad Params < Key >) Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine < Result < Key , ĠValue >> Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload After ( params , Ġcont . as Callback ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoad Ġinitial Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġcalled Ġfirst Ġto Ġinitialize Ġa ĠP aged List Ġwith Ġdata . ĠIf Ġit 's Ġpossible Ġto Ġcount ĊĠĠĠĠ Ġ* Ġthe Ġitems Ġthat Ġcan Ġbe Ġloaded Ġby Ġthe ĠDataSource , Ġit 's Ġrecommended Ġto Ġpass Ġthe Ġloaded Ġdata Ġto ĊĠĠĠĠ Ġ* Ġthe Ġcallback Ġvia Ġthe Ġthree - parameter Ġ[ Load Initial Callback . on Result ]. ĠThis Ġenables ĠP aged Lists ĊĠĠĠĠ Ġ* Ġpresent ing Ġdata Ġfrom Ġthis Ġsource Ġto Ġdisplay Ġplaceholders Ġto Ġrepresent Ġun loaded Ġitems . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ Load Initial Params . requested Load Size ] Ġis Ġa Ġhint , Ġnot Ġa Ġrequirement , Ġso Ġit Ġmay Ġbe Ġmay Ġbe ĊĠĠĠĠ Ġ* Ġaltered Ġor Ġignored . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams ĠParameters Ġfor Ġinitial Ġload , Ġincluding Ġrequested Ġload Ġsize . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠCallback Ġthat Ġreceives Ġinitial Ġload Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġload Initial ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Initial Params < Key >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Initial Callback < Key , ĠValue > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPre pend Ġpage Ġwith Ġthe Ġkey Ġspecified Ġby Ġ[ Load Params . key ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt 's Ġvalid Ġto Ġreturn Ġa Ġdifferent Ġlist Ġsize Ġthan Ġthe Ġpage Ġsize Ġif Ġit 's Ġeasier , Ġe . g . Ġif Ġyour ĊĠĠĠĠ Ġ* Ġbackend Ġdefines Ġpage Ġsizes . ĠIt Ġis Ġgenerally Ġpreferred Ġto Ġincrease Ġthe Ġnumber Ġloaded Ġthan ĊĠĠĠĠ Ġ* Ġreduce . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠData Ġmay Ġbe Ġpassed Ġsynchronous ly Ġduring Ġthe Ġload Ġmethod , Ġor Ġdeferred Ġand Ġcalled Ġat Ġa Ġlater ĊĠĠĠĠ Ġ* Ġtime . ĠFurther Ġloads Ġgoing Ġdown Ġwill Ġbe Ġblocked Ġuntil Ġthe Ġcallback Ġis Ġcalled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġdata Ġcannot Ġbe Ġloaded Ġ( for Ġexample , Ġif Ġthe Ġrequest Ġis Ġinvalid , Ġor Ġthe Ġdata Ġwould Ġbe Ġstale ĊĠĠĠĠ Ġ* Ġand Ġinconsistent ), Ġit Ġis Ġvalid Ġto Ġcall Ġ[ invalidate ] Ġto Ġinvalidate Ġthe Ġdata Ġsource , Ġand ĊĠĠĠĠ Ġ* Ġprevent Ġfurther Ġloading . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams ĠParameters Ġfor Ġthe Ġload , Ġincluding Ġthe Ġkey Ġfor Ġthe Ġnew Ġpage , Ġand Ġrequested Ġload ĊĠĠĠĠ Ġ* Ġsize . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠCallback Ġthat Ġreceives Ġloaded Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġload Before ( params : ĠLoad Params < Key >, Ġcallback : ĠLoad Callback < Key , ĠValue >) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAppend Ġpage Ġwith Ġthe Ġkey Ġspecified Ġby Ġ[ Load Params . key ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt 's Ġvalid Ġto Ġreturn Ġa Ġdifferent Ġlist Ġsize Ġthan Ġthe Ġpage Ġsize Ġif Ġit 's Ġeasier , Ġe . g . Ġif Ġyour ĊĠĠĠĠ Ġ* Ġbackend Ġdefines Ġpage Ġsizes . ĠIt Ġis Ġgenerally Ġpreferred Ġto Ġincrease Ġthe Ġnumber Ġloaded Ġthan ĊĠĠĠĠ Ġ* Ġreduce . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠData Ġmay Ġbe Ġpassed Ġsynchronous ly Ġduring Ġthe Ġload Ġmethod , Ġor Ġdeferred Ġand Ġcalled Ġat Ġa Ġlater ĊĠĠĠĠ Ġ* Ġtime . ĠFurther Ġloads Ġgoing Ġdown Ġwill Ġbe Ġblocked Ġuntil Ġthe Ġcallback Ġis Ġcalled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġdata Ġcannot Ġbe Ġloaded Ġ( for Ġexample , Ġif Ġthe Ġrequest Ġis Ġinvalid , Ġor Ġthe Ġdata Ġwould Ġbe Ġstale ĊĠĠĠĠ Ġ* Ġand Ġinconsistent ), Ġit Ġis Ġvalid Ġto Ġcall Ġ[ invalidate ] Ġto Ġinvalidate Ġthe Ġdata Ġsource , Ġand ĊĠĠĠĠ Ġ* Ġprevent Ġfurther Ġloading . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams ĠParameters Ġfor Ġthe Ġload , Ġincluding Ġthe Ġkey Ġfor Ġthe Ġnew Ġpage , Ġand Ġrequested Ġload ĊĠĠĠĠ Ġ* Ġsize . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠCallback Ġthat Ġreceives Ġloaded Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġload After ( params : ĠLoad Params < Key >, Ġcallback : ĠLoad Callback < Key , ĠValue >) ĊĊĠĠĠ Ġ@ Suppress (" Red undant Visibility Modifier ") Ġ// ĠMet al ava Ġdoesn 't Ġinherit Ġvisibility Ġproperly . ĊĠĠĠ Ġinternal Ġoverride Ġfun ĠgetKey Internal ( item : ĠValue ): ĠKey Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Cannot Ġget Ġkey Ġby Ġitem Ġin Ġpage Key ed DataSource ") ĊĊĠĠĠ Ġ@ Suppress (" Red undant Visibility Modifier ") Ġ// ĠMet al ava Ġdoesn 't Ġinherit Ġvisibility Ġproperly . ĊĠĠĠ Ġinternal Ġoverride Ġval Ġsupports Page D ro pping Ġ= Ġfalse ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġ< To Value Ġ: ĠAny > Ġmap By Page ( ĊĠĠĠĠĠĠĠ Ġfunction : ĠFunction < List < Value >, ĠList < To Value >> ĊĠĠĠ Ġ): ĠPage Key ed DataSource < Key , ĠTo Value > Ġ= ĠWrapper Page Key ed DataSource ( this , Ġfunction ) ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġ< To Value Ġ: ĠAny > Ġmap By Page ( ĊĠĠĠĠĠĠĠ Ġfunction : Ġ( List < Value >) Ġ-> ĠList < To Value > ĊĠĠĠ Ġ): ĠPage Key ed DataSource < Key , ĠTo Value > Ġ= Ġmap By Page ( Function Ġ{ Ġfunction ( it ) Ġ}) ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġ< To Value Ġ: ĠAny > Ġmap ( ĊĠĠĠĠĠĠĠ Ġfunction : ĠFunction < Value , ĠTo Value > ĊĠĠĠ Ġ): ĠPage Key ed DataSource < Key , ĠTo Value > Ġ= ĊĠĠĠĠĠĠĠ Ġmap By Page ( Function Ġ{ Ġlist Ġ-> Ġlist . map Ġ{ Ġfunction . apply ( it ) Ġ} Ġ}) ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġ< To Value Ġ: ĠAny > Ġmap ( ĊĠĠĠĠĠĠĠ Ġfunction : Ġ( Value ) Ġ-> ĠTo Value ĊĠĠĠ Ġ): ĠPage Key ed DataSource < Key , ĠTo Value > Ġ= Ġmap By Page ( Function Ġ{ Ġlist Ġ-> Ġlist . map ( function ) Ġ}) Ċ } Ċ Ċ private Ġfun Ġ< Key Ġ: ĠAny , ĠValue Ġ: ĠAny > ĠC ancellable Continuation < Result < Key , ĠValue >> . as Callback () Ġ= ĊĠĠĠ Ġobject Ġ: ĠPage Key ed DataSource . Load Callback < Key , ĠValue >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Result ( data : ĠList < Value >, Ġadjacent Page Key : ĠKey ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresume ( Result ( data , Ġadjacent Page Key )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresume With Exception ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ