/* Ċ Ġ* ĠCopyright Ġ( c ) ĠFacebook , ĠInc . Ġand Ġits Ġaffiliates . Ċ Ġ* Ċ Ġ* Ġ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 . facebook . l ith o Ċ Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠDe cla res Ġa Ġstate Ġvariable Ġwithin Ġa ĠComponent . ĠThe Ġinitializer Ġwill Ġprovide Ġthe Ġinitial Ġvalue Ġif Ċ Ġ* Ġit Ġhasn 't Ġalready Ġbeen Ġinitialized Ġin Ġa Ġprevious Ġlifecycle Ġof Ġthe ĠComponent . Ċ Ġ* Ċ Ġ* ĠAssign ments Ġto Ġthe Ġstate Ġvariables Ġare Ġallowed Ġonly Ġin Ġ[ update State ] Ġblock Ġto Ġbatch Ġupdates Ġand Ċ Ġ* Ġtrigger Ġa ĠUI Ġlayout Ġonly Ġonce Ġper Ġbatch . Ċ Ġ*/ Ċ fun Ġ< T > ĠD sl Scope . useState ( initializer : Ġ() Ġ-> ĠT ): ĠState Delegate < T > Ġ= ĊĠĠĠ ĠState Delegate ( this , Ġinitializer ) Ċ Ċ /** ĠDelegate Ġto Ġaccess Ġand Ġinitialize Ġa Ġstate Ġvariable . Ġ*/ Ċ class ĠState Delegate < T >( private Ġval Ġc : ĠComponent Context , Ġprivate Ġval Ġinitializer : Ġ() Ġ-> ĠT ) Ġ{ ĊĠ Ġoperator Ġfun ĠgetValue ( nothing : ĠNothing ?, Ġproperty : ĠK Property < *> ): ĠState < T > Ġ{ ĊĠĠĠ Ġval Ġhook State Key Ġ= Ġ"${ c . component Scope . global Key }:${ property . name }" ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġval Ġvalue Ġ= Ġc . state Handler !!. hook State . get Or Put ( ĊĠĠĠĠĠĠĠ Ġhook State Key , ĊĠĠĠĠĠĠĠ Ġinitializer ) Ġas ĠT ĊĠĠĠ Ġreturn ĠState ( hook State Key , Ġvalue ) ĊĠ Ġ} Ċ } Ċ Ċ /** ĠInterface Ġwith Ġwhich Ġa Ġcomponent Ġgets Ġthe Ġvalue Ġfrom Ġa Ġstate Ġor Ġupdates Ġit . Ġ*/ Ċ class ĠState < T >( internal Ġval Ġkey : ĠString , Ġprivate Ġval Ġvalue : ĠT ) Ġ{ ĊĊĠ Ġfun Ġget () Ġ= Ġvalue Ċ } Ċ Ċ /** ĠAllow Ġreading Ġvalue Ġproperty Ġof Ġa Ġstate Ġwith Ġsimpler Ġsyntax Ġ*/ Ċ val Ġ< T > ĠState < T >. value : ĠT ĊĠ Ġget () Ġ= Ġthis . get () Ċ Ċ /** ĠScope Ġobject Ġfor Ġupdating Ġstate Ġ- Ġwhile Ġin Ġa ĠState Updater Ġblock , ĠState . value Ġmay Ġbe Ġset . Ġ*/ Ċ class ĠState Updater ( private Ġval Ġstate Handler : ĠState Handler ) Ġ{ ĊĊĠ Ġvar Ġ< T > ĠState < T >. value : ĠT ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġget () Ġ= Ġstate Handler . hook State [ key ] Ġas ĠT ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġstate Handler . hook State [ key ] Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠEn queues Ġa Ġstate Ġupdate Ġblock Ġto Ġbe Ġrun Ġbefore Ġthe Ġnext Ġlayout Ġin Ġorder Ġto Ġupdate Ġhook Ġstate . Ċ Ġ* ĠAssign ments Ġto Ġthe Ġstate Ġvariables , Ġcreated Ġby Ġ[ useState ], Ġare Ġonly Ġallowed Ġinside Ġthis Ġblock . Ċ Ġ*/ Ċ fun ĠD sl Scope . update State ( block : ĠState Updater . () Ġ-> ĠUnit ) Ġ{ ĊĠ Ġthis . update Hook State Async Ġ{ Ġstate Handler : ĠState Handler Ġ-> ĊĠĠĠ ĠState Updater ( state Handler ). block () ĊĠ Ġ} Ċ } Ċ