package Ġclub . sk 1 er . element a . state Ċ Ċ import Ġjava . util . function . Consumer Ċ import Ġjava . util . function . Function Ċ Ċ /** Ċ Ġ* ĠThe Ġbase Ġfor Ġall ĠElement a ĠState Ġobjects . Ċ Ġ* Ċ Ġ* ĠState Ġobjects Ġare Ġessentially Ġjust Ġa Ġwrapper Ġaround Ġa Ġvalue . Ċ Ġ* ĠHowever , Ġthe Ġability Ġto Ġbe Ġdee ply Ġintegrated Ġinto Ġan Ċ Ġ* ĠElement a Ġcomponent Ġallows Ġsome Ġnice Ġfunctionality . Ċ Ġ* Ċ Ġ* ĠThe Ġprimary Ġadvantage Ġof Ġusing Ġstate Ġis Ġthat Ġa Ġsingle Ġstate Ċ Ġ* Ġobject Ġcan Ġbe Ġshared Ġbetween Ġmultiple Ġcomponents Ġor Ċ Ġ* Ġconstraints . ĠThis Ġallows Ġone Ġvalue Ġupdate Ġto Ġbe Ġseen Ċ Ġ* Ġby Ġmultiple Ġcomponents Ġor Ġconstraints . ĠFor Ġexample , Ġif Ġa Ċ Ġ* Ġcomponent Ġhas Ġmany Ġtext Ġchildren , Ġand Ġthey Ġall Ġshare Ġthe Ċ Ġ* Ġsame Ġcolor Ġstate Ġvariable , Ġthen Ġwhenever Ġthe Ġvalue Ġof Ġthe Ċ Ġ* Ġstate Ġobject Ġis Ġupdated , Ġall Ġof Ġthe Ġtext Ġcomponents Ġwill Ċ Ġ* Ġinstant ly Ġchange Ġcolor . Ċ Ġ* Ċ Ġ* ĠAnother Ġadvantage Ġar ises Ġwhen Ġusing ĠKotlin , Ġas ĠStates Ċ Ġ* Ġcan Ġbe Ġdeleg ated Ġto . ĠFor Ġmore Ġinformation , Ġsee Ċ Ġ* Ġdeleg ation . kt . Ċ Ġ* Ċ Ġ* Ġ@ see ĠState Deleg ator Ċ Ġ*/ Ċ abstract Ġclass ĠState < T > Ġ{ ĊĠĠĠ Ġprotected Ġval Ġlisteners Ġ= Ġmutable ListOf <( T ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġvalue Ġof Ġthis ĠState Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget (): ĠT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġvalue Ġof Ġthis ĠState Ġobject ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġalso Ġnot ifies Ġall Ġof Ġthe Ġlisteners Ġof Ġthis ĊĠĠĠĠ Ġ* ĠState Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġset ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit ( value ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLike Ġ[ set ], Ġbut Ġaccepts Ġa Ġlambda Ġwhich Ġtakes Ġthe ĊĠĠĠĠ Ġ* Ġcurrent Ġvalue Ġof Ġthis ĠState Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset ( mapper : Ġ( T ) Ġ-> ĠT ) Ġ= Ġset ( mapper ( get ())) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa Ġlistener Ġwhich Ġwill Ġbe Ġcalled Ġwhenever Ġthe ĊĠĠĠĠ Ġ* Ġvalue Ġof Ġthis ĠState Ġobject Ġchanges ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġcallback Ġwhich , Ġwhen Ġinvoked , Ġremoves Ġthis Ġlistener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon SetValue ( listener : Ġ( T ) Ġ-> ĠUnit ): Ġ() Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġlisteners . remove ( listener ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa Ġlistener Ġwhich Ġwill Ġbe Ġcalled Ġwhenever Ġthe ĊĠĠĠĠ Ġ* Ġvalue Ġof Ġthis ĠState Ġobject Ġchanges ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġcallback Ġwhich , Ġwhen Ġinvoked , Ġremoves Ġthis Ġlistener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon SetValue ( listener : ĠConsumer < T >) Ġ= Ġon SetValue Ġ{ Ġlistener . accept ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġget OrDefault ( defaultValue : ĠT ) Ġ= Ġget () Ġ?: ĠdefaultValue ĊĊĠĠĠ Ġfun Ġget OrElse ( default Provider : Ġ() Ġ-> ĠT ) Ġ= Ġget () Ġ?: Ġdefault Provider () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġthis Ġstate Ġinto Ġa Ġnew Ġstate ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠM apped State ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< U > Ġmap ( mapper : Ġ( T ) Ġ-> ĠU ) Ġ= ĠM apped State ( this , Ġmapper ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġthis Ġstate Ġinto Ġa Ġnew Ġstate ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠM apped State ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< U > Ġmap ( mapper : ĠFunction < T , ĠU >): ĠState < U > Ġ= Ġmap Ġ{ Ġmapper . apply ( it ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠZ ips Ġthis Ġstate Ġwith Ġanother Ġstate ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠZ ipped State ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< U > Ġzip ( other State : ĠState < U >): ĠState < Pair < T , ĠU >> Ġ= ĠZ ipped State ( this , Ġother State ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġimplementation Ġof Ġ[ State ], Ġcontaining Ġonly Ġa Ċ Ġ* Ġbacking Ġfield Ċ Ġ*/ Ċ open Ġclass ĠBasic State < T >( protected Ġvar Ġvalue Back er : ĠT ) Ġ: ĠState < T >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget () Ġ= Ġvalue Back er ĊĊĠĠĠ Ġoverride Ġfun Ġset ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġvalue Back er ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġvalue Back er Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġsuper . set ( value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġstate Ġwhich Ġmaps Ġanother Ġstate Ġusing Ġthe Ġprovided Ċ Ġ* Ġmapping Ġfunction . Ċ Ġ* Ċ Ġ* ĠThis Ġshould Ġprimarily Ġbe Ġused Ġvia Ġthe Ġ[ State . map ] Ġor Ċ Ġ* Ġ[ club . sk 1 er . element a . state . map ] Ġmethods . Ċ Ġ*/ Ċ open Ġclass ĠM apped State < T , ĠU >( initialState : ĠState < T >, Ġprivate Ġval Ġmapper : Ġ( T ) Ġ-> ĠU ) Ġ: ĠBasic State < U >( mapper ( initialState . get ())) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġremove Listener Ġ= ĠinitialState . on SetValue Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( mapper ( it )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChanges Ġthe Ġstate Ġthat Ġthis Ġstate Ġmaps Ġfrom . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġcalls Ġ[ State . set ], Ġand Ġwill Ġtrigger ĊĠĠĠĠ Ġ* Ġall Ġof Ġits Ġlisteners . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġre bind ( newState : ĠState < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Listener () ĊĠĠĠĠĠĠĠ Ġremove Listener Ġ= ĠnewState . on SetValue Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( mapper ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( mapper ( newState . get ())) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġstate Ġwhich Ġcombin es Ġtwo Ġother Ġstates Ġinto Ġa Ġ[ Pair ]. Ċ Ġ* Ċ Ġ* ĠThis Ġshould Ġprimarily Ġbe Ġused Ġvia Ġthe Ġ[ State . zip ] Ġor Ċ Ġ* Ġ[ club . sk 1 er . element a . state . zip ] Ġmethods . Ċ Ġ*/ Ċ class ĠZ ipped State < T , ĠU >( ĊĠĠĠ Ġfirst State : ĠState < T >, ĊĠĠĠ Ġsecond State : ĠState < U > Ċ ) Ġ: ĠBasic State < Pair < T , ĠU >>( first State . get () Ġto Ġsecond State . get ()) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġremove First Listener Ġ= Ġfirst State . on SetValue Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( it Ġto Ġget (). second ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġremove Second Listener Ġ= Ġsecond State . on SetValue Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( get (). first Ġto Ġit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChanges Ġthe Ġfirst Ġstate Ġthat Ġthis Ġstate Ġuses . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethods Ġcalls Ġ[ State . set ], Ġand Ġwill Ġtrigger ĊĠĠĠĠ Ġ* Ġall Ġof Ġits Ġlisteners . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġre bind First ( newState : ĠState < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove First Listener () ĊĠĠĠĠĠĠĠ Ġremove First Listener Ġ= ĠnewState . on SetValue Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( it Ġto Ġget (). second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( newState . get () Ġto Ġget (). second ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChanges Ġthe Ġsecond Ġstate Ġthat Ġthis Ġstate Ġuses . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethods Ġcalls Ġ[ State . set ], Ġand Ġwill Ġtrigger ĊĠĠĠĠ Ġ* Ġall Ġof Ġits Ġlisteners . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġre bind Second ( newState : ĠState < U >) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Second Listener () ĊĠĠĠĠĠĠĠ Ġremove Second Listener Ġ= ĠnewState . on SetValue Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( get (). first Ġto Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( get (). first Ġto ĠnewState . get ()) ĊĠĠĠ Ġ} Ċ } Ċ