package Ġdeleg ates Ċ Ċ import Ġreact . Component Ċ import Ġreact . R Props Ċ import Ġreact . R State Ċ import Ġreact . setState Ċ import Ġkotlin . reflect . K Mutable Property 1 Ċ import Ġkotlin . reflect . K Property ĊĊ Ċ object ĠReact Prop And State Deleg ates Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠKotlin / JS ĠReact ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠJ ol an ĠR ens en Ġ- Ġ 2 0 2 0 ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠCan Ġbe Ġused Ġas Ġa Ġway Ġto Ġsh orthand ĠsetState Ġ{ Ġstate Item Ġ= Ġ* Ġ} Ġand Ġstate . state Item Ġto Ġjust Ġa Ġvariable Ġstate Item ĊĠĠĠĠ Ġ* Ġ ĠAs Ġthis Ġis Ġpure ly Ġfunctional Ġit 's Ġfine Ġto Ġput Ġit Ġinside Ġa Ġclass Ġbody ĊĠĠĠĠ Ġ* Ġ ĠUse Ġlike : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġvar Ġitem Ġby Ġstate Delegate Of ( Your State :: item ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ ĠDo Ġnot Ġsend Ġthese Ġas Ġa Ġprop Ġto Ġa Ġchild Component . ĠUse ĠState As Prop Ġfor Ġthat ! ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġclass ĠState Delegate < T >( ĊĠĠĠĠĠĠĠ Ġval Ġget : Ġ() Ġ-> ĠT , ĊĠĠĠĠĠĠĠ Ġval Ġset : Ġ( T ) Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >) Ġ= Ġget () ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ= Ġset ( value ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠState Delegate <* >) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( other Ġas ? ĠState Delegate <* >) ?. get ?. invoke () Ġ== Ġget () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġget (). hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S Ġ: ĠR State , ĠT > ĠComponent < *, ĠS >. state Delegate Of ( state Item : ĠK Mutable Property 1 < S , ĠT >): ĠState Delegate < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠState Delegate ({ Ġstate Item . get ( state ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Item . set ( this , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCan Ġbe Ġused Ġto Ġsend Ġboth Ġa Ġgetter Ġand Ġsetter Ġfor Ġa Ġstate Ġto Ġa Ġchild Ġcomponent Ġas Ġa Ġprop . ĊĠĠĠĠ Ġ* ĠIn side Ġchild Ġcomponents , Ġuse ĠRead Write Prop Deleg ates Ġto Ġ" unpack " Ġa ĠState As Prop ĊĠĠĠĠ Ġ* ĠCan Ġeven Ġbe Ġused Ġto Ġsend Ġto ĠPure Components ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġchild Component Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġattrs Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġitem Ġ= Ġstate . item ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġset Item Ġ= Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ= Ġit ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġcan Ġnow Ġbe Ġwritten Ġlike : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġchild Component Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġattrs Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġitem Ġ= Ġstate As Prop ( Your State :: item ) ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠState As Prop < T >( ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠT , ĊĠĠĠĠĠĠĠ Ġval Ġset : Ġ( T ) Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >) Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ= Ġset ( value ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠState As Prop <* >) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( other Ġas ? ĠState As Prop <* >) ?. value Ġ== Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S Ġ: ĠR State , ĠT > ĠComponent < *, ĠS >. state As Prop ( state Item : ĠK Mutable Property 1 < S , ĠT >): ĠState As Prop < T > Ġ= ĊĠĠĠĠĠĠĠ ĠState As Prop ( state Item . get ( state )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Item . set ( this , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġsame Ġas Ġstate As Prop , Ġbut Ġwithout Ġsetter , Ġjust Ġa Ġgetter Ġ*/ ĊĠĠĠ Ġfun Ġ< S Ġ: ĠR State , ĠT > ĠComponent < *, ĠS >. state As Prop ( default : ĠT ) Ġ= ĊĠĠĠĠĠĠĠ ĠState As Prop ( default ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCan Ġbe Ġused Ġto Ġ" unpack " Ġa ĠState As Prop Ġto Ġeasily Ġuse Ġits Ġgetter Ġand Ġsetter Ġin Ġa Ġsingle Ġvariable . ĊĠĠĠĠ Ġ* ĠSafe Ġto Ġuse Ġin ĠPure Components ĊĠĠĠĠ Ġ* ĠUse Ġlike : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġvar Ġitem Ġby Ġprop Delegate Of ( Your Props :: item ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠRead Write Prop Delegate < T >( ĊĠĠĠĠĠĠĠ Ġval Ġget : Ġ() Ġ-> ĠT , ĊĠĠĠĠĠĠĠ Ġval Ġset : Ġ( T ) Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >) Ġ= Ġget () ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ= Ġset ( value ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠRead Write Prop Delegate <* >) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( other Ġas ? ĠRead Write Prop Delegate <* >) ?. get ?. invoke () Ġ== Ġget () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< Props Ġ: ĠR Props , ĠState Ġ: ĠR State , ĠVar Type Ġ: ĠAny ?> ĠComponent < Props , ĠState >. prop Delegate Of ( prop Item : ĠK Mutable Property 1 < Props , ĠState As Prop < Var Type >>) Ġ= ĊĠĠĠĠĠĠĠ ĠRead Write Prop Delegate ({ Ġprop Item . get ( props ). value Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġprop Item . get ( props ). set ( it ) Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCan Ġbe Ġused Ġto Ġaccess Ġ( getter - only ) Ġprop Ġvalues Ġwithout Ġhaving Ġto Ġtype Ġprop .* Ġevery Ġtime . ĊĠĠĠĠ Ġ* ĠSafe Ġto Ġuse Ġin ĠPure Components ĊĠĠĠĠ Ġ* ĠUse Ġlike : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġval Ġitem Ġby ĠreadOnly Prop Delegate Of ( Your Props :: item ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠReadOnly Prop Delegate < T >( ĊĠĠĠĠĠĠĠ Ġval Ġget : Ġ() Ġ-> ĠT ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >) Ġ= Ġget () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠRead Write Prop Delegate <* >) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( other Ġas ? ĠRead Write Prop Delegate <* >) ?. get ?. invoke () Ġ== Ġget () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< Props Ġ: ĠR Props , ĠState Ġ: ĠR State , ĠVal Type Ġ: ĠAny ?> ĠComponent < Props , ĠState >. prop Delegate Of ( prop Item : ĠK Mutable Property 1 < Props , ĠVal Type >) Ġ= ĊĠĠĠĠĠĠĠ ĠReadOnly Prop Delegate Ġ{ Ġprop Item . get ( props ) Ġ} Ċ } Ċ