/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . compose . runtime Ċ Ċ import Ġkotlin . native . identity HashCode Ċ import Ġandroidx . compose . runtime . snapshots . Snapshot Mutable State Ċ import Ġkotlinx . coroutines . delay Ċ Ċ internal Ġactual Ġobject ĠTrace Ġ{ ĊĠĠĠ Ġactual Ġfun Ġbegin Section ( name : ĠString ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing . ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġend Section ( token : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing . ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠTODO ( ig ot ti ): Ġdo Ġwe Ġneed Ġactual Ġprocessing Ġfor Ġthose ? Ċ actual Ġannotation Ġclass ĠCheck Result ( actual Ġval Ġsuggest : ĠString ) Ċ actual Ġannotation Ġclass ĠTest Only () Ċ Ċ /** Ċ Ġ* ĠClock Ġwith Ġfixed Ġdelay Ġbetween Ġframes Ġ( 1 6 ms ), Ġindependent Ġfrom Ġany Ġdisplay / window . Ċ Ġ* Ċ Ġ* ĠIt Ġis Ġused Ġby Ġ[ with Frame Nan os ] Ġand Ġ[ with Frame Millis ] Ġif Ġone Ġis Ġnot Ġpresent Ċ Ġ* Ġin Ġthe Ġcalling Ġ[ kotlin . coroutines . Coroutine Context ]. Ċ Ġ* Ċ Ġ* ĠUse Ġit Ġonly Ġwhere Ġyou Ġdon 't Ġneed Ġto Ġshow Ġanimation Ġin Ġa Ġwindow . Ċ Ġ* Ċ Ġ* ĠIf Ġyou Ġneed Ġa Ġframe Ġclock Ġfor Ġchanging Ġthe Ġstate Ġof Ġan Ġanimation Ġthat Ġshould Ġbe Ġdisplayed Ġto Ċ Ġ* Ġuser , Ġuse Ġ[ Mon otonic Frame Clock ] Ġthat Ġis Ġbound Ġto Ġthe Ġcurrent Ġwindow . ĠYou Ġcan Ġaccess Ġit Ġusing Ċ Ġ* Ġ[ La unched Effect ]: Ċ Ġ* Ġ``` Ċ Ġ* ĠLa unched Effect Ġ{ Ċ Ġ* ĠĠ Ġval Ġframe Clock Ġ= Ġcoroutine Context [ Mon otonic Frame Clock ] Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠOr Ġusing Ġ[ remember Coroutine Scope ]: Ċ Ġ* Ġ``` Ċ Ġ* Ġval Ġscope Ġ= Ġremember Coroutine Scope () Ċ Ġ* Ġval Ġframe Clock Ġ= Ġscope . coroutine Context [ Mon otonic Frame Clock ] Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠIf Ġ[ with Frame Nan os ] Ġ/ Ġ[ with Frame Millis ] Ġruns Ġinside Ġthe Ġcoroutine Ġscope Ċ Ġ* Ġobtained Ġusing Ġ[ La unched Effect ] Ġor Ġ[ remember Coroutine Scope ] Ġthey Ġalso Ġuse Ċ Ġ* Ġ[ Mon otonic Frame Clock ] Ġwhich Ġis Ġbound Ġto Ġthe Ġcurrent Ġwindow . Ċ Ġ*/ Ċ @ Deprecated ( ĊĠĠĠ Ġ" Mon otonic Frame Clock s Ġare Ġnot Ġglobally Ġapplicable Ġacross Ġplatforms . Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Use Ġan Ġappropriate Ġlocal Ġclock ." Ċ ) Ċ actual Ġval ĠDefault Mon otonic Frame Clock : ĠMon otonic Frame Clock ĊĠĠĠ Ġget () Ġ= ĠSix ty F ps Mon otonic Frame Clock Ċ Ċ private Ġobject ĠSix ty F ps Mon otonic Frame Clock Ġ: ĠMon otonic Frame Clock Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval Ġfps Ġ= Ġ 6 0 ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< R > Ġwith Frame Nan os ( ĊĠĠĠĠĠĠĠ Ġon Frame : Ġ( Long ) Ġ-> ĠR ĊĠĠĠ Ġ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 L Ġ/ Ġfps ) ĊĠĠĠĠĠĠĠ Ġreturn Ġon Frame ( kotlin . system . getTime Nan os ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġactual Ġfun Ġ< T > Ġcreate Snapshot Mutable State ( ĊĠĠĠ Ġvalue : ĠT , ĊĠĠĠ Ġpolicy : ĠSnapshot Mutation Policy < T > Ċ ): ĠSnapshot Mutable State < T > Ġ= ĠSnapshot Mutable State Impl ( value , Ġpolicy ) Ċ Ċ internal Ġactual Ġopen Ġclass ĠThread Local < T > ĊĠĠĠ Ġactual Ġconstructor ( private Ġval Ġinitial Value : Ġ() Ġ-> ĠT ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġvalue : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġactual ĊĠĠĠ Ġfun Ġget (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġinitial Value () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual ĊĠĠĠ Ġfun Ġset ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ internal Ġactual Ġclass ĠSnapshot Thread Local < T > Ġactual Ġconstructor () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġref : ĠT ? Ġ= Ġnull ĊĠĠĠ Ġactual ĊĠĠĠ Ġfun Ġget (): ĠT ? Ġ= Ġref ĊĠĠĠ Ġactual ĊĠĠĠ Ġfun Ġset ( value : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġref Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġactual Ġfun Ġidentity HashCode ( instance : ĠAny ?): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġinstance . identity HashCode () Ċ } Ċ Ċ @ Published Api Ċ internal Ġactual Ġinline Ġfun Ġ< R > Ġsynchronized ( lock : ĠAny , Ġblock : Ġ() Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠ Ġreturn Ġblock () Ċ } Ċ Ċ actual Ġclass ĠAtomic Reference < V > Ġactual Ġconstructor ( private Ġvar Ġvalue : ĠV ) Ġ{ ĊĠĠĠ Ġactual ĊĠĠĠ Ġfun Ġget (): ĠV Ġ= Ġvalue ĊĠĠĠ Ġactual ĊĠĠĠ Ġfun Ġset ( value : ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual ĊĠĠĠ Ġfun Ġget AndSet ( value : ĠV ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . value . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual ĊĠĠĠ Ġfun Ġcompare AndSet ( expect : ĠV , ĠnewValue : ĠV ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġexpect ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠnewValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ }