package Ġcom . example . android . code labs . paging . data Ċ Ċ import Ġcom . example . android . code labs . paging . api . Github Service Ċ import Ġcom . example . android . code labs . paging . api . IN _ QUAL IFIER Ċ import Ġcom . example . android . code labs . paging . model . Repo Ċ import Ġcom . example . android . code labs . paging . model . Repo SearchResult Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable Shared Flow Ċ import Ġretrofit 2 . HttpException Ċ import Ġjava . io . IOException Ċ Ċ class ĠGithub Repository ( private Ġval Ġservice : ĠGithub Service ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġin Memory Cache Ġ= Ġmutable ListOf < Repo >() ĊĠĠĠ Ġprivate Ġval Ġsearch Results Ġ= ĠMutable Shared Flow < Repo SearchResult >( replay Ġ= Ġ 1 ) ĊĠĠĠ Ġprivate Ġvar Ġlast Requested Page Ġ= ĠG ITHUB _ START ING _ PAGE _ INDEX ĊĠĠĠ Ġprivate Ġvar Ġis Request InProgress Ġ= Ġfalse ĊĊĠĠĠ Ġsuspend Ġfun Ġget SearchResult Stream ( query : ĠString ): ĠFlow < Repo SearchResult > Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Requested Page Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġin Memory Cache . clear () ĊĠĠĠĠĠĠĠ Ġrequest And SaveData ( query ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsearch Results ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġrequest More ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Request InProgress ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsuccessful Ġ= Ġrequest And SaveData ( query ) ĊĠĠĠĠĠĠĠ Ġif Ġ( successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Requested Page ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġretry ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Request InProgress ) Ġreturn ĊĠĠĠĠĠĠĠ Ġrequest And SaveData ( query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġrequest And SaveData ( query : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġis Request InProgress Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġsuccessful Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġapi Query Ġ= Ġquery Ġ+ ĠIN _ QUAL IFIER ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġservice . search Repos ( api Query , Ġlast Requested Page , ĠNET WORK _ PAGE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepos Ġ= Ġresponse . items ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Memory Cache . addAll ( repos ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepos ByName Ġ= Ġrepos ByName ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results . emit ( Repo SearchResult . Success ( repos ByName )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccessful Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results . emit ( Repo SearchResult . Error ( exception )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results . emit ( Repo SearchResult . Error ( exception )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Request InProgress Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġsuccessful ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrepos ByName ( query : ĠString ): ĠList < Repo > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġin Memory Cache . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name . contains ( query , Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . description Ġ!= Ġnull Ġ&& Ġit . description . contains ( query , Ġtrue )) ĊĠĠĠĠĠĠĠ Ġ}. sorted With ( compare By Descending < Repo > Ġ{ Ġit . stars Ġ}. then By Ġ{ Ġit . name Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ