package Ġcom . hoc . com ic app . utils Ċ Ċ import Ġandroidx . collection . L ru Cache Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Experimental Time Ċ import Ġkotlin . time . Time Mark Ċ import Ġkotlin . time . Time Source Ċ Ċ @ Opt In ( Experimental Time :: class ) Ċ class ĠCache < K Ġ: ĠAny , ĠV Ġ: ĠAny >( ĊĠ ĠmaxSize : ĠInt , ĊĠ Ġprivate Ġval Ġentry Lifetime : ĠDuration , ĊĠ Ġprivate Ġval Ġsize Of : Ġ( key : ĠK , Ġvalue : ĠV ) Ġ-> ĠInt Ġ= ĠDefault Size Calculator , Ċ ) Ġ{ ĊĠ Ġprivate Ġval Ġtime Source Ġ= ĠTime Source . Mon otonic ĊĊĠ Ġprivate Ġval Ġcache Ġ= Ġobject Ġ: ĠL ru Cache < K , ĠValue < V >>( maxSize ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġsize Of ( key : ĠK , Ġvalue : ĠValue < V >) Ġ= Ġsize Of ( key , Ġvalue . value ) ĊĠ Ġ} ĊĊĠ Ġ@ Synchron ized Ġoperator Ġfun Ġget ( key : ĠK ): ĠV ? Ġ{ ĊĠĠĠ Ġval Ġvalue Ġ= Ġcache [ key ] Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġif Ġ( value . expired Time . has Passed Now ()) Ġ{ ĊĠĠĠĠĠ Ġremove ( key ) ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġvalue . value ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġremove ( key : ĠK ) Ġ{ ĊĠĠĠ Ġcache . remove ( key ) ĊĠ Ġ} ĊĊĠ Ġoperator Ġfun Ġset ( key : ĠK , Ġvalue : ĠV ) Ġ{ ĊĠĠĠ Ġcache . put ( ĊĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠ ĠValue ( ĊĠĠĠĠĠĠĠ Ġvalue , ĊĠĠĠĠĠĠĠ Ġtime Source . mark Now () Ġ+ Ġentry Lifetime ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġdata Ġclass ĠValue < V Ġ: ĠAny >( ĊĠĠĠ Ġval Ġvalue : ĠV , ĊĠĠĠ Ġval Ġexpired Time : ĠTime Mark , ĊĠ Ġ) ĊĊĠ Ġprivate Ġobject ĠDefault Size Calculator Ġ: Ġ( Any , ĠAny ) Ġ-> ĠInt Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( p 1 : ĠAny , Ġp 2 : ĠAny ): ĠInt Ġ= Ġ 1 ĊĠ Ġ} Ċ } Ċ