package Ġcom . y ureka . technology . y tc . util . rx Ċ Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Scheduler Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġio . reactivex . subjects . Subject Ċ Ċ /** Ċ Ġ* ĠPort Ġof ĠVariable Ġfrom ĠRX ĠSwift Ġto ĠKotlin . Ċ Ġ* ĠVariable Ġis Ġa Ġwrapper Ġfor ĠBehavior Subject . Ċ Ġ* Ċ Ġ* ĠUn like Ġ` Behavior Subject ` Ġit Ġcan 't Ġterminate Ġwith Ġerror , Ġand Ġwhen Ġvariable Ġis Ġde allocated Ġit Ġwill Ċ Ġ* Ġcomplete Ġits Ġobservable Ġsequence Ġ(` update Listener `). Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġessentially Ġan Ġ ĠRx Ġversion Ġof Ġ[ android . databinding . Observable Field ]. Ċ Ġ* Ċ Ġ* ĠNote : ĠVariables Ġare Ġlike Ġ[ Behavior Rel ays ]( https :// github . com / J ake Wh art on / Rx Relay ) Ġexcept Ġfor : Ċ Ġ* ĠĠĠĠĠĠ Ġ- Ġ[ Variable . get ] Ġis Ġalways Ġnon - null Ġ( Mutable Variables Ġare Ġrequired Ġto Ġhave Ġan Ġinitial Ġvalue ), Ġwhere Ġas Ċ Ġ* ĠĠĠĠĠĠĠĠ ĠBehavior Rel ays Ġdo Ġnot Ġhave Ġa Ġvalue Ġuntil Ġone Ġis Ġprovided . Ċ Ġ* ĠĠĠĠĠĠ Ġ- ĠVariable Ġ( immutable ) Ġand ĠMutable Variable Ġare Ġseparated Ġout . Ċ Ġ* ĠĠĠĠĠĠ Ġ- ĠVariable . update Listener () Ġwill Ġalways Ġemit Ġa Ġvalue Ġimmediately Ġbecause Ġget () Ġis Ġnon - null . Ċ Ġ* Ċ Ġ* Ġ@ param Ġscheduler Ġis Ġused Ġas Ġthe Ġthread Ġto Ġobserve Ġ[ update Listener ] Ġon . Ċ Ġ* Ċ Ġ* Ġ@ see Ġ< a Ġhref =" https :// gist . github . com / oper ando / 2 add 7 bb ad 5 3 5 bc 3 0 f 7 3 4 0 bf 8 c 0 4 6 6 0 d 7 "> Kotlin ĠImplementation </ a > Ċ Ġ* Ġ@ see Ġ< a Ġhref =" https :// github . com / Reactive X / Rx Swift / blob / master / Rx Swift / Subject s / Variable . swift "> Swift ĠImplementation </ a > Ċ Ġ*/ Ċ open Ġclass ĠMutable Variable < T Ġ: ĠAny > Ġconstructor ( ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġvalue : ĠT , ĊĠĠĠ Ġscheduler : ĠScheduler Ġ= ĠS chedulers . computation () Ċ ) Ġ: ĠVariable < T > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġserialized Subject : ĠSubject < T > Ġ= ĠBehavior Subject . create Default < T >( value ). to Serialized () ĊĊĠĠĠ Ġprivate Ġval Ġupdate Listener Ġ= Ġserialized Subject . observe On ( scheduler ) ĊĊĠĠĠ Ġoverride Ġfun Ġget (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChanges Ġthe Ġvalue Ġstored Ġin Ġthis ĠVariable Ġand Ġemits Ġthe Ġnew Ġvalue Ġto Ġsubscribers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġopen Ġfun Ġset ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġserialized Subject . onNext ( this . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġmodifying Ġthe Ġvalue Ġin Ġa Ġsynchronized Ġway Ġso Ġthat Ġthe Ġget () Ġand Ġset () Ġare Ġatomic . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : Ġanything Ġsynchronized Ġcannot Ġbe Ġ` inline `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġsafe Set ( calculate NewValue : Ġ( T ) Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( calculate NewValue ( get ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChange Ġlistener . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOb served Ġon Ġcomputation Ġscheduler . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtransformer ĠUsed Ġfor Ġshorter Ġsyntax Ġwhen Ġusing Ġ[ Transform ers ]. ĠThis Ġparameter Ġhas Ġbeen Ġdeprecated Ġin Ġfavor ĊĠĠĠĠ Ġ* ĠĠ Ġof ĠRx Ġextension Ġfunctions Ġlike Ġin Ġ[ Rx Extensions ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstream (): ĠObservable < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġupdate Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠString Ġsuitable Ġfor Ġdebugging . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T Ġ: ĠAny > ĠMutable Variable < Optional < T >> . set Optional ( value : ĠT ?) Ġ{ ĊĠĠĠ Ġthis . set ( Optional ( value )) Ċ } Ċ Ċ inline Ġfun Ġ< T Ġ: ĠAny > ĠMutable Variable < Optional < T >> . get Optional (): ĠT ? Ġ{ ĊĠĠĠ Ġreturn Ġthis . get (). value OrNull Ċ } Ċ