/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 2 1 ĠPaul ĠAmb rose Ġ( p amb rose @ mac . com ) Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . github . p amb rose . common . concurrent Ċ Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ Ċ // ĠSee : Ġhttps :// medium . com / sw lh / kotlin - for - l unch - atomic - t - 2 6 1 3 5 1 0 4 8 fad Ċ Ċ class ĠAtomic < T >( var Ġvalue : ĠT ) Ġ: ĠMutex Ġby ĠMutex () Ġ{ ĊĠ Ġsuspend Ġinline Ġfun Ġset With Lock ( owner : ĠAny ? Ġ= Ġnull , Ġaction : Ġ( T ) Ġ-> ĠT ): ĠT Ġ= ĊĠĠĠ Ġ( this Ġas ĠMutex ). with Lock ( owner ) Ġ{ Ġaction ( value ). also Ġ{ Ġvalue Ġ= Ġit Ġ} Ġ} ĊĊĠ Ġsuspend Ġinline Ġfun Ġ< V > Ġwith Lock ( owner : ĠAny ? Ġ= Ġnull , Ġaction : ĠT . () Ġ-> ĠV ): ĠV Ġ= ĊĠĠĠ Ġ( this Ġas ĠMutex ). with Lock ( owner ) Ġ{ Ġvalue . action () Ġ} Ċ }