package Ġcom . ep am . coroutine cache . core . actions Ċ Ċ import Ġcom . ep am . coroutine cache . core .* Ċ import Ġcom . ep am . coroutine cache . internal . Record Expired Checker Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . async Ċ import Ġjava . lang . reflect . Type Ċ Ċ /** Ċ Ġ* ĠAction Ġthat Ġretrieves Ġrecord Ġfrom Ġthe Ġcache Ċ Ġ*/ Ċ class ĠGet Record Action ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdelete Expired Records Action : ĠDelete Expired Records Action , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrecord Expired Checker : ĠRecord Expired Checker , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisk Cache : ĠPersistence , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmemory : ĠMemory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscope : ĠCor outine Scope Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAsync Ġfunction Ġthat Ġretrieves Ġrecord Ġfrom Ġcache . ĊĠĠĠĠ Ġ* ĠIf Ġrecord Ġis Ġexpired Ġand Ġflag Ġuse If Expired Ġis Ġtrue Ġthen Ġreturn Ġrecord Ġand Ġdelete Ġit Ġfrom Ġcache , ĊĠĠĠĠ Ġ* Ġotherwise Ġonly Ġdelete Ġrecord Ġfrom Ġcache Ġand Ġreturn Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġ< T > Ġget Record ( key : ĠString , Ġentry Type : ĠType , Ġuse Record Even If Expired : ĠBoolean Ġ= Ġfalse ): ĠRecord < T >? Ġ= Ġscope . async Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġrecord Ġ= Ġmemory . get Record < T >( key ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( record Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . set Source ( Source . MEMORY ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Ġ= Ġdisk Cache . get Record ( key , Ġentry Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( record Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . set Source ( Source . PER SIST ENCE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory . save Record ( key , Ġrecord ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ async Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( record Expired Checker . has Record Expired ( record )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Expired Records Action . delete Expired Record ( key , Ġrecord ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ async Ġif Ġ( use Record Even If Expired ) Ġrecord Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ async Ġrecord ĊĠĠĠ Ġ}. await () Ċ }