/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 , Ġ 2 0 2 0 , Ġ 2 0 2 1 Ġs hed an iel Ċ Ġ* Ċ Ġ* Ġ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 Ġme . s hed an iel . link ie . discord Ċ Ċ import Ġcom . so y wiz . kor io . async . run Blocking No Js Ċ import Ġme . s hed an iel . link ie . discord . utils . get OrNull Ċ import Ġjava . time . Duration Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . timer Task Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ @ Suppress (" Member Visibility Can Be Private ", Ġ" unused ") Ċ class ĠValue Keeper < T > Ġconstructor ( val Ġtime To Keep : ĠDuration , Ġvar Ġvalue Backend : ĠOptional < T >, Ġval Ġgetter : Ġsuspend Ġ() Ġ-> ĠT ) Ġ: ĠLazy < T > Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtimer Ġ= ĠTimer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġtask : ĠTimer Task ? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor ( time To Keep : ĠDuration , Ġvalue : ĠT , Ġgetter : Ġsuspend Ġ() Ġ-> ĠT ) Ġ: Ġthis ( time To Keep , ĠOptional . of ( value ), Ġgetter ) ĊĠĠĠ Ġconstructor ( time To Keep : ĠDuration , Ġgetter : Ġsuspend Ġ() Ġ-> ĠT ) Ġ: Ġthis ( time To Keep , Ġrun Blocking No Js Ġ{ Ġgetter () Ġ}, Ġgetter ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking No Js Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget (): ĠT Ġ= Ġvalue Backend . get OrNull () Ġ?: Ġgetter (). also Ġ{ Ġvalue Backend Ġ= ĠOptional . of ( it ); Ġschedule () Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Backend Ġ= ĠOptional . empty () ĊĠĠĠĠĠĠĠ ĠSystem . gc () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġschedule () Ġ{ ĊĠĠĠĠĠĠĠ Ġtask ?. cancel () ĊĠĠĠĠĠĠĠ Ġtask Ġ= Ġtimer Task Ġ{ Ġrun Blocking No Js Ġ{ Ġclear () Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġtimer . schedule ( task , Ġtime To Keep . to Millis ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġvalue : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrun Blocking No Js Ġ{ Ġget () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Initialized (): ĠBoolean Ġ= Ġvalue Backend . isPresent Ċ } Ċ Ċ fun Ġ< T > Ġvalue Keeper ( time To Keep : ĠDuration Ġ= ĠDuration . of Minutes ( 2 ), Ġgetter : Ġsuspend Ġ() Ġ-> ĠT ): ĠValue Keeper Property < T > Ġ= ĊĠĠĠ ĠValue Keeper Property ( time To Keep , Ġgetter ) Ċ Ċ class ĠValue Keeper Property < T >( ĊĠĠĠ Ġtime To Keep : ĠDuration , ĊĠĠĠ Ġgetter : Ġsuspend Ġ() Ġ-> ĠT , Ċ ) Ġ: ĠReadOnly Property < Any ?, ĠT >, ĠLazy < T > Ġ{ ĊĠĠĠ Ġval Ġke eper Lazy Ġ= Ġlazy Ġ{ ĠValue Keeper ( time To Keep , Ġgetter ) Ġ} ĊĠĠĠ Ġval Ġke eper Ġby Ġke eper Lazy ĊĠĠĠ Ġval Ġproperty Ġ= ĠReadOnly Property < Any ?, ĠT > Ġ{ Ġ_, Ġ_ Ġ-> Ġrun Blocking No Js Ġ{ Ġke eper . get () Ġ} Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . property . getValue ( this Ref , Ġproperty ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Initialized (): ĠBoolean Ġ= Ġke eper Lazy . isInitialized () Ġ&& Ġke eper . isInitialized () ĊĠĠĠ Ġoverride Ġval Ġvalue : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrun Blocking No Js Ġ{ Ġke eper . get () Ġ} Ċ }