package Ġcom . mon day 8 am . tweet me ck . data . remote Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . paging . DataSource Ċ import Ġandroidx . paging . Item Key ed DataSource Ċ import Ġcom . mon day 8 am . tweet me ck . data . Result Ċ import Ġcom . mon day 8 am . tweet me ck . data . map pers . Status To Tweet Ċ import Ġcom . mon day 8 am . tweet me ck . data . map pers . as Lambda Ċ import Ġcom . mon day 8 am . tweet me ck . data . map pers . map With Ċ import Ġcom . mon day 8 am . tweet me ck . data . models . Tweet Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ class ĠSearch DataSource Factory ( ĊĠĠĠ Ġprivate Ġval Ġquery : ĠString , ĊĠĠĠ Ġprivate Ġval Ġclient : ĠTwitter Client Ċ ) Ġ: ĠDataSource . Factory < Long , ĠTweet >() Ġ{ ĊĠĠĠ Ġval Ġsource LiveData Ġ= ĠMutable LiveData < Search DataSource >() ĊĠĠĠ Ġoverride Ġfun Ġcreate (): ĠDataSource < Long , ĠTweet > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠSearch DataSource ( query , Ġclient ) ĊĠĠĠĠĠĠĠ Ġsource LiveData . post Value ( source ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsource ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSearch DataSource ( ĊĠĠĠ Ġprivate Ġval Ġquery : ĠString , ĊĠĠĠ Ġprivate Ġval Ġclient : ĠTwitter Client Ċ ) Ġ: ĠItem Key ed DataSource < Long , ĠTweet >(), ĠCor outine Scope Ġby ĠCor outine Scope ( Dispatch ers . Main ) Ġ{ ĊĊĠĠĠ Ġval Ġrequest State Ġ= ĠMutable LiveData < Result < Unit >>() ĊĊĠĠĠ Ġoverride Ġfun ĠgetKey ( item : ĠTweet ): ĠLong Ġ= Ġitem . id ĊĊĠĠĠ Ġoverride Ġfun Ġload After ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Params < Long >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Callback < Tweet > ĊĠĠĠ Ġ) Ġ= Ġsearch Query ( query , Ġparams . key , Ġcallback ) ĊĊĠĠĠ Ġoverride Ġfun Ġload Initial ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Initial Params < Long >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Initial Callback < Tweet > ĊĠĠĠ Ġ) Ġ= Ġsearch Query ( query , Ġnull , Ġcallback ) ĊĊĠĠĠ Ġprivate Ġfun Ġsearch Query ( query : ĠString , Ġkey : ĠLong ?, Ġcallback : ĠLoad Callback < Tweet >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest State . value Ġ= ĠResult . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . search ( query , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . map With ( Status To Tweet (- 1 ). as Lambda ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest State . value Ġ= ĠResult . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest State . value Ġ= ĠResult . Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Before ( params : ĠLoad Params < Long >, Ġcallback : ĠLoad Callback < Tweet >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġignored , Ġsince Ġwe Ġonly Ġever Ġappend Ġto Ġour Ġinitial Ġload ĊĠĠĠ Ġ} Ċ } Ċ