package Ġformula ide . ui . utils Ċ Ċ import Ġreact . State Instance Ċ import Ġkotlin . reflect . K Property Ċ Ċ interface ĠDeleg ated Property < out ĠT > Ġ{ Ċ ĉ val Ġvalue : ĠT Ċ ĉ operator Ġfun Ġcomponent 1 (): ĠT Ċ ĉ operator Ġfun ĠgetValue ( this Ref : ĠNothing ?, Ġproperty : ĠK Property < *> ): ĠT ĊĊ ĉ @ Suppress (" FunctionName ") Ġ// ĠFact ories Ġthat Ġlook Ġlike Ġconstructors Ċ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ fun Ġ< T > ĠDeleg ated Property ( get : Ġ() Ġ-> ĠT ) Ġ= Ċĉĉ ĉ Read Deleg ated Property ( get ) ĊĊĉ ĉ fun Ġ< T > ĠDeleg ated Property ( get : Ġ() Ġ-> ĠT , ĠonUpdate : Ġ(( T ) Ġ-> ĠT ) Ġ-> ĠUnit ) Ġ= Ċĉĉ ĉ Write Deleg ated Property ( Read Deleg ated Property ( get ), ĠonUpdate ) ĊĊĉ ĉ fun Ġ< T > ĠState Instance < T >. as Deleg ated () Ġ= Ċĉĉ ĉ Write Deleg ated Property ( Read Deleg ated Property Ġ{ Ġcomponent 1 () Ġ}, Ċĉĉĉ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Ġ= Ġ{ Ġv Ġ-> Ġcomponent 2 (). invoke ( v ) Ġ}) Ċ ĉ } Ċ } Ċ Ċ class ĠRead Deleg ated Property < out ĠT >( val Ġget : Ġ() Ġ-> ĠT ) Ġ: ĠDeleg ated Property < T > Ġ{ ĊĊ ĉ // ĠNormal Ġaccess Ċ ĉ override Ġval Ġvalue Ġget () Ġ= Ġget () ĊĊ ĉ // ĠDest ruct uration Ċ ĉ override Ġoperator Ġfun Ġcomponent 1 () Ġ= Ġvalue ĊĊ ĉ // ĠDeleg ation Ċ ĉ override Ġoperator Ġfun ĠgetValue ( Ċĉ ĉ this Ref : ĠNothing ?, Ċĉ ĉ property : ĠK Property <* >, Ċ ĉ ) Ġ= Ġget () Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠEnables ĠKotlin Ġproperty Ġsyntax Ġs ugar Ġfor Ġa Ġcustom Ġproperty Ġwith Ġno Ġbacking Ġfield . Ċ Ġ* Ċ Ġ* Ġ## ĠExamples Ċ Ġ* Ċ Ġ* ĠIn Ġall Ġexamples , Ġwe Ġassume Ġthe Ġexistence Ġof Ġa Ġvalid Ġ[ Deleg ated Property ]: Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġval Ġp Ġ= ĠDeleg ated Property < Int >( ĠâĢ¦ Ġ) Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ### ĠExample Ġ 1 : Ġnormal Ġaccess Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġprintln ( p . get ()) Ġ// Ġread Ġvia Ġthe Ġgetter Ċ Ġ* Ġprintln ( p . value ) Ġ// Ġread Ġas Ġa Ġproperty Ċ Ġ* Ġp . set ( 5 ) ĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ### ĠExample Ġ 2 : Ġdestruct uration Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġval Ġ( v , Ġset V ) Ġ= Ġp Ċ Ġ* Ġprintln ( v ) ĠĠĠĠĠĠ Ġ// Ġread Ċ Ġ* Ġset V ( 5 ) ĠĠĠĠĠĠĠĠĠ Ġ// Ġwrite Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ### ĠExample Ġ 3 : Ġdeleg ation Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġval Ġv Ġby Ġp Ċ Ġ* Ġprintln ( v ) ĠĠĠĠĠĠ Ġ// Ġread Ċ Ġ* Ġv Ġ= Ġ 5 ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwrite Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ class ĠWrite Deleg ated Property < T >( Ċ ĉ val Ġreader : ĠRead Deleg ated Property < T >, Ċ ĉ private Ġval ĠonUpdate : Ġ(( T ) Ġ-> ĠT ) Ġ-> ĠUnit , Ċ ) Ġ: ĠDeleg ated Property < T > Ġby Ġreader Ġ{ ĊĊ ĉ // ĠNormal Ġaccess Ċ ĉ override Ġvar Ġvalue : ĠT Ċĉ ĉ get () Ġ= Ġreader . value Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ on Update Ġ{ Ġvalue Ġ} Ċĉ ĉ } ĊĊ ĉ // ĠAccess Ġthat Ġprovides Ġthe Ġcurrent Ġvalue , Ġso Ġit Ġisn 't Ġcaptured Ġin Ġthe Ġcaller 's Ġclosure Ċ ĉ fun Ġupdate ( transform : ĠT . () Ġ-> ĠT ) Ġ= ĠonUpdate ( transform ) ĊĊ ĉ // ĠDest ruct uration Ċ ĉ operator Ġfun Ġcomponent 2 (): Ġ( T . () Ġ-> ĠT ) Ġ-> ĠUnit Ġ= ĠonUpdate ĊĊ ĉ // ĠDeleg ation Ċ ĉ operator Ġfun ĠsetValue ( Ċĉ ĉ this Ref : ĠNothing ?, Ċĉ ĉ property : ĠK Property <* >, Ċĉ ĉ value : ĠT , Ċ ĉ ) Ġ= ĠonUpdate Ġ{ Ġvalue Ġ} Ċ Ċ } Ċ Ċ // region ĠExtensions Ċ Ċ fun Ġ< I Ġ: ĠAny , ĠO Ġ: ĠAny ?> ĠDeleg ated Property < I ?> . map ( transform : Ġ( I ) Ġ-> ĠO ) Ġ= Ċ ĉ Read Deleg ated Property Ġ{ Ġvalue ?. let ( transform ) Ġ} Ċ Ċ fun Ġ< I Ġ: ĠAny , ĠO Ġ: ĠAny > ĠDeleg ated Property < I >. map ( transform : Ġ( I ) Ġ-> ĠO ) Ġ= Ċ ĉ Read Deleg ated Property Ġ{ Ġtransform ( value ) Ġ} Ċ Ċ fun Ġ< I > ĠDeleg ated Property < I >. filter ( predicate : Ġ( I ) Ġ-> ĠBoolean ) Ġ= Ċ ĉ Read Deleg ated Property Ġ{ Ġvalue . take If ( predicate ) Ġ} Ċ Ċ inline Ġfun Ġ< re ified ĠI > ĠDeleg ated Property <* >. filter Is () Ġ= Ċ ĉ map Ġ{ Ġit Ġas ? ĠI Ġ} Ċ Ċ /** Ċ Ġ* ĠGet Ġnotified Ġwhen Ġthe Ġ[ Deleg ated Property ]' s Ġsetter Ġis Ġcalled . Ċ Ġ* Ċ Ġ* Ġ@ param Ġlistener ĠA Ġcallback Ġexecuted Ġwith Ġthe Ġnew Ġvalue . Ċ Ġ*/ Ċ fun Ġ< T > ĠWrite Deleg ated Property < T >. on Set ( listener : Ġ( T ) Ġ-> ĠUnit ) Ġ= Ċ ĉ Write Deleg ated Property ( Ċĉ ĉ reader Ġ= Ġreader , Ċĉ ĉ on Update Ġ= Ġ{ ĠnewValue Generator Ġ-> Ċĉĉ ĉ update Ġ{ Ċĉĉĉ ĉ newValue Generator ( this @ update ). also ( listener ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ ) Ċ Ċ /** Ċ Ġ* ĠCancel Ġthe Ġupdate Ġif Ġthe Ġnew Ġvalue Ġis Ġequal Ġto Ġthe Ġprevious Ġone . Ċ Ġ* Ċ Ġ* ĠThis Ġallows Ġto Ġdecrease Ġthe Ġnumber Ġof Ġrenders Ġfor Ġlist Ġmodifications . Ċ Ġ* Ċ Ġ* Ġ@ see ĠAny . equals Ċ Ġ* Ġ@ see ĠAny . hashCode Ċ Ġ*/ Ċ fun Ġ< T > ĠWrite Deleg ated Property < T >. use Equals () Ġ= Ċ ĉ Write Deleg ated Property ( Ċĉ ĉ reader Ġ= Ġreader , Ċĉ ĉ on Update Ġ= Ġ{ ĠnewValue Generator Ġ-> Ċĉĉ ĉ val Ġold Ġ= Ġreader . value Ċĉĉ ĉ val Ġnew Ġ= ĠnewValue Generator ( old ) ĊĊĉĉ ĉ // ĠSw allow Ġthe Ġupdate Ġif Ġthe Ġobject Ġis Ġthe Ġsame Ġreference Ċĉĉ ĉ if Ġ( new Ġ=== Ġold ) Ċĉĉĉ ĉ Unit ĊĊĉĉ ĉ // ĠTest ĠhashCode Ġbefore Ġtesting Ġequals Ċĉĉ ĉ else Ġif Ġ( new . hashCode () Ġ== Ġold . hashCode () Ġ&& Ġnew Ġ== Ġold ) Ċĉĉĉ ĉ console . log (" Cancelled Ġstate Ġupdate Ġbecause Ġobjects Ġare Ġthe Ġsame Ġaccording Ġto Ġ' equals '. ") Ċĉĉ ĉ else Ċĉĉĉ ĉ update Ġ{ Ġnew Ġ} Ċĉ ĉ } Ċ ĉ ) Ċ Ċ /** Ċ Ġ* ĠWhen Ġthe Ġlist Ġis Ġreplaced Ġby Ġanother Ġone , Ġprefer Ġkeeping Ġthe Ġelement Ġin Ġthe Ġoriginal Ġlist Ġ( if Ġit Ġwas Ġnot Ġedited ), Ġrather Ġthan Ġreplacing Ġit Ġby Ġthe Ġnew Ġversion . Ċ Ġ* Ċ Ġ* ĠBecause ĠReact Ġalways Ġcomp ares Ġobjects Ġwith Ġrefer ential Ġequality , Ġthis Ġcan Ġsignificantly Ġreduce Ġrenders Ġof Ġchild Ġcomponents Ġwhen Ġusing Ġthe Ġresult Ġof Ġan ĠAPI Ġendpoint Ġin Ġ` useState ` Ġor Ġsimilar . Ċ Ġ* Ċ Ġ* Ġ@ see Ġuse Equals Ċ Ġ* Ġ@ see ĠAny . equals Ċ Ġ* Ġ@ see ĠAny . hashCode Ċ Ġ*/ Ċ fun Ġ< T > ĠWrite Deleg ated Property < List < T >> . use List Equality () Ġ= Ċ ĉ Write Deleg ated Property ( Ċĉ ĉ reader Ġ= Ġreader , Ċĉ ĉ on Update Ġ= Ġ{ ĠnewValue Generator Ġ-> Ċĉĉ ĉ val Ġold Ġ= Ġreader . value Ċĉĉ ĉ val Ġnew Ġ= ĠnewValue Generator ( old ) ĊĊĉĉ ĉ val Ġresult Ġ= ĠArrayList < T >( new . size ) Ċĉĉ ĉ var Ġi Ġ= Ġ 0 Ċĉĉ ĉ while Ġ( i Ġ< Ġnew . size Ġ&& Ġi Ġ< Ġold . size ) Ġ{ Ċĉĉĉ ĉ val Ġo Ġ= Ġold [ i ] Ċĉĉĉ ĉ val Ġn Ġ= Ġnew [ i ] ĊĊĉĉĉ ĉ result . add ( Ċĉĉĉĉ ĉ if Ġ( o . hashCode () Ġ== Ġn . hashCode () Ġ&& Ġo Ġ== Ġn ) Ġo Ċĉĉĉĉ ĉ else Ġn Ċĉĉĉ ĉ ) ĊĊĉĉĉ ĉ i ++ Ċĉĉ ĉ } Ċĉĉ ĉ while Ġ( i Ġ< Ġnew . size ) Ġ{ Ċĉĉĉ ĉ result . add ( new [ i ]) ĊĊĉĉĉ ĉ i ++ Ċĉĉ ĉ } ĊĊĉĉ ĉ check ( result Ġ== Ġnew ) Ġ{ Ġ" L ' optim isation Ġdes Ġlist es Ġne Ġdev r ait Ġpas Ġmodifier Ġles ĠÃ©lÃ© ments Ġde Ġla Ġliste ." Ġ} Ċĉĉ ĉ update Ġ{ Ġresult Ġ} Ċĉ ĉ } Ċ ĉ ) Ċ Ċ // endregion Ċ