package Ġinfo . ben jamin h ill . d roid Ċ Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġkotlinx . coroutines . with Context ĊĊ Ċ /** Ċ Ġ* ĠFrom Ġhttps :// stackoverflow . com / questions / 5 1 8 6 2 7 1 5 / how - would - i - wrap - this - not - qu ite - by - lazy - result - caching - function - call - in - id io / 5 1 8 7 7 6 1 2 # 5 1 8 7 7 6 1 2 Ċ Ġ* Ġ@ param Ġinitializer Ġfunction Ġto Ġsuspend Ġand Ġcall Ġonce Ċ Ġ* Ċ Ġ* Ġ< code > Ċ Ġ* Ġprivate Ġval Ġcamera Device Ġ= ĠLazy Suspend < Camera Device > Ġ{ Ċ Ġ* ĠĠ Ġval Ġfoo Ġ= Ġother Sus pending Call () Ċ Ġ* ĠĠ Ġsuspend Coroutine Ġ{ Ġcont Ġ-> Ġcont . resume ( foo . use ()) Ġ} Ċ Ġ* Ġ</ code > Ċ Ġ*/ Ċ internal Ġclass ĠLazy Suspend < out ĠT Ġ: ĠAny >( initializer : Ġsuspend Ġ() Ġ-> ĠT ) Ġ{ ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġcached Value : ĠAny ? Ġ= ĠUn initialized Value ĊĠĠĠ Ġprivate Ġvar Ġinitializer : Ġ( suspend Ġ() Ġ-> ĠT )? Ġ= Ġinitializer ĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġsuspend Ġoperator Ġfun Ġinvoke (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġcached Value ĊĠĠĠĠĠĠĠ Ġif Ġ( v 1 Ġ!== ĠUn initialized Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġv 1 Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġcached Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 2 Ġ!== ĠUn initialized Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") Ġ( v 2 Ġas ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtyped Value Ġ= Ġinitializer !! () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value Ġ= Ġtyped Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġobject ĠUn initialized Value ĊĠĠĠ Ġ} Ċ }