/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . move . st dex t Ċ Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . progress . Process Canceled Exception Ċ import Ġcom . intellij . openapi . progress . Progress Manager Ċ import Ġcom . intellij . openapi . progress . util . Progress Indicator Utils Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent .* Ċ import Ġjava . util . concurrent . locks . Condition Ċ import Ġjava . util . concurrent . locks . Lock Ċ import Ġkotlin . reflect . K Property ĊĊ Ċ /** Ċ Ġ* ĠA Ġcontainer Ġfor Ġan Ġimmutable Ġvalue , Ġwhich Ġallows Ċ Ġ* Ġreading Ġand Ġupdating Ġvalue Ġsafely Ġconcurrent ly . Ċ Ġ* Ġ[ Async Value ] Ġis Ġsimilar Ġto ĠClo jure 's Ġatom . Ċ Ġ* Ċ Ġ* Ġ[ update Async ] Ġmethod Ġis Ġused Ġto Ġschedule Ġa Ġmodification Ċ Ġ* Ġof Ġthe Ġform Ġ`( T ) Ġ-> ĠPromise < T >`. ĠIt Ġis Ġguaranteed Ġthat Ċ Ġ* Ġall Ġupdates Ġare Ġserialized . Ċ Ġ*/ Ċ class ĠAsync Value < T >( initial : ĠT ) Ġ{ ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġcurrent : ĠT Ġ= Ġinitial ĊĊĠĠĠ Ġprivate Ġval Ġupdates : ĠQueue <( T ) Ġ-> ĠCompletableFuture < Unit >> Ġ= ĠConcurrent Linked Queue () ĊĠĠĠ Ġprivate Ġvar Ġrunning : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġcurrent State : ĠT Ġget () Ġ= Ġcurrent ĊĊĠĠĠ Ġfun Ġupdate Async ( updater : Ġ( T ) Ġ-> ĠCompletableFuture < T >): ĠCompletableFuture < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠCompletableFuture < T >() ĊĠĠĠĠĠĠĠ Ġupdates . add Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdater ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. handle Ġ{ Ġnext , Ġerr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( err Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . current Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . complete ( next ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġlog Ġ` Process Canceled Exception ` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( err Ġis ĠProcess Canceled Exception Ġ|| Ġerr Ġis ĠCompletion Exception Ġ&& Ġerr . cause Ġis ĠProcess Canceled Exception )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( err ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . complete Exception ally ( err ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstart Update Processing () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Sync ( updater : Ġ( T ) Ġ-> ĠT ): ĠCompletableFuture < T > Ġ= ĊĠĠĠĠĠĠĠ Ġupdate Async Ġ{ ĠCompletableFuture . completed Future ( updater ( it )) Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġstart Update Processing () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( running Ġ|| Ġupdates . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġnext Update Ġ= Ġupdates . remove () ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġnext Update ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. when Complete Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Update Processing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Update Processing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġstop Update Processing () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( running ) ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG : ĠLogger Ġ= Ġlogger < Async Value <* >>() ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠThread Local Delegate < T >( initializer : Ġ() Ġ-> ĠT ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtl : ĠThread Local < T > Ġ= ĠThread Local . with Initial ( initializer ) ĊĊĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtl . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtl . set ( value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Throws ( TimeoutException :: class , ĠExecution Exception :: class , ĠInterruptedException :: class ) Ċ fun Ġ< V > ĠFuture < V >. get With Check Canceled ( timeout Millis : ĠLong ): ĠV Ġ{ ĊĠĠĠ Ġval Ġdeadline Ġ= ĠSystem . nano Time () Ġ+ ĠTimeUnit . MILLISECONDS . to Nan os ( timeout Millis ) ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Manager . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( System . nano Time () Ġ>= Ġdeadline ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠLock . with Lock And Checking Cancelled ( action : Ġ() Ġ-> ĠT ): ĠT Ġ= ĊĠĠĠ ĠProgress Indicator Utils . compute With Lock And Checking Canceled < T , ĠException >( this , Ġ 1 0 , ĠTimeUnit . MILLISECONDS , Ġaction ) Ċ Ċ fun ĠCondition . await With Check Cancelled () Ġ{ ĊĠĠĠ ĠProgress Indicator Utils . await With Check Canceled ( this ) Ċ } Ċ