package Ġde . fl ap do od le . photos ync . progress Ċ Ċ import Ġde . fl ap do od le . fx . lazy . Changed Listener Ċ import Ġde . fl ap do od le . fx . lazy . Lazy Value Ċ Ċ object ĠMonitor Ġ{ ĊĊĠ Ġprivate Ġval Ġthread Reporter Ġ= ĠThread Local < Reporter >() ĊĠ Ġprivate Ġval Ġstate Ġ= ĠThread Local < State Holder >() ĊĊĠ Ġfun Ġ< T > Ġexecute ( reporter : ĠReport er Ġ= ĠConsole Reporter (), Ġaction : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġthread Reporter . set ( reporter ) ĊĠĠĠĠĠ Ġstate . set ( State Holder ()) ĊĠĠĠĠĠ Ġreturn Ġaction () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġreporter . report ("") ĊĠĠĠĠĠ Ġstate . remove () ĊĠĠĠĠĠ Ġthread Reporter . remove () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġ< T > Ġscope ( key : ĠString , Ġaction : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġval Ġstate Holder Ġ= Ġstate . get () ĊĊĠĠĠ Ġreturn Ġif Ġ( state Holder != null ) Ġ{ ĊĠĠĠĠĠ Ġval Ġlast State Ġ= Ġstate Holder . start ( key ) ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġaction () ĊĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Holder . end ( last State ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġaction () ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġfun Ġmessage ( message : ĠString ) Ġ{ ĊĠĠĠ Ġstate . get ()?. let Ġ{ ĊĠĠĠĠĠ Ġit . message ( message ) ĊĠĠĠĠĠ Ġthread Reporter . get ()?. let Ġ{ Ġreporter Ġ-> ĊĠĠĠĠĠĠĠ Ġreporter . report ( it . as Message ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġdata Ġclass ĠState ( ĊĠĠĠĠĠ Ġval Ġkey : ĠString , ĊĠĠĠĠĠ Ġval Ġmap : ĠMap < String , String > Ġ= Ġempty Map () ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġfun Ġmessage ( message : ĠString ): ĠState Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcopy ( map Ġ= Ġmap Ġ+ Ġ( key Ġto Ġmessage )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas Message (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġmap . map Ġ{ Ġ"${ it . key }: Ġ${ it . value }" Ġ}. join ToString ( separator Ġ= Ġ" Ġ| Ġ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġclass ĠState Holder () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcurrent State = State ("") ĊĊĠĠĠ Ġfun Ġstart ( key : ĠString ): ĠState Ġ{ ĊĠĠĠĠĠ Ġval Ġret Ġ= Ġcurrent State ĊĠĠĠĠĠ Ġcurrent State Ġ= Ġcurrent State . copy ( key Ġ= Ġkey ) ĊĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġend ( state : ĠState ) Ġ{ ĊĠĠĠĠĠ Ġthis . currentState = state ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmessage ( message : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġcurrent State = currentState . message ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas Message (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcurrent State . as Message () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinterface ĠReport er Ġ{ ĊĠĠĠ Ġfun Ġreport ( message : ĠString ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠ Ġinline Ġoperator Ġfun Ġinvoke ( cross inline Ġdelegate : Ġ( String ) Ġ-> ĠUnit ): ĠReport er Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠReport er Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreport ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate ( message ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġclass ĠConsole Reporter Ġ: ĠReport er Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġclear Last Message Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġreport ( message : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġprint ( clear Last Message ) ĊĠĠĠĠĠ Ġprint ("\ r ") ĊĠĠĠĠĠ Ġprint ( message ) ĊĠĠĠĠĠ Ġprint ("\ r ") ĊĠĠĠĠĠ Ġclear Last Message Ġ= Ġ" Ġ". repeat ( message . length ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} Ċ }