/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 Ġ- Ġpresent , ĠRx Change Ġcontributors Ċ Ġ* Ċ Ġ* Ġ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 . um br al tech . rx change . adapter Ċ Ċ import Ġcom . um br al tech . rx change . message . Change Message Ċ import Ġcom . um br al tech . rx change . type . Change Type Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġjava . util . concurrent . locks . ReadWrite Lock Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ /** Ċ Ġ* ĠAn Ġadapter Ġthat Ġimplements Ġthe Ġreactive Ġchange Ġmodel Ġfor Ġa Ġsingle Ġelement Ċ Ġ* Ċ Ġ* Ġ@ param ĠD Ġthe Ġtype Ġof Ġdata Ċ Ġ* Ġ@ constructor ĠInitializes Ġthe Ġadapter Ġwith Ġa Ġvalue , Ġwithout Ġemit ting Ġa Ġchange Ġmessage Ċ Ġ*/ Ċ class ĠSingle Change Adapter < D >( @ Volatile Ġprivate Ġvar Ġdata : ĠD ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġpublish Subject : ĠPublish Subject < Change Message < D >> Ġ= ĠPublish Subject . create () ĊĠĠĠ Ġprivate Ġval Ġread Write Lock : ĠRead Write Lock Ġ= ĠRe entrant ReadWrite Lock () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġadapter Ġwith Ġ[ data ] Ġand Ġemits Ġa Ġchange Ġmessage Ġto Ġsurrounding Ġob servers ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġchange Ġsnapshot Ġwill Ġcontain Ġthe Ġvalue Ġthat Ġwas Ġjust Ġupdated ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġelement Ġwas Ġadded , Ġfalse Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( data : ĠD ): ĠBoolean Ġ= Ġread Write Lock . write Lock (). with Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Data : ĠD Ġ= Ġthis . data ĊĠĠĠĠĠĠĠ Ġthis . data Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġ// ĠSignal Ġupdate ĊĠĠĠĠĠĠĠ Ġpublish Subject . onNext ( Change Message ( old Data , Ġthis . data , ĠChange Type . UPDATE , Ġdata )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġthe Ġunderlying Ġdata ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcurrent Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget (): ĠD Ġ= Ġread Write Lock . read Lock (). with Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġa Ġreference Ġto Ġthe Ġobservable Ġused Ġfor Ġlistening Ġto Ġchange Ġmessages ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġobservable Ġreference ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Observable (): ĠObservable < Change Message < D >> Ġ= Ġpublish Subject Ċ }