package Ġguide me . vol unte ers . helpers . datas ervices . datasource Ċ Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġjava . io . Serializable Ċ import Ġjava . util .* Ċ Ċ interface ĠData Ġ: ĠSerializable Ċ Ċ open Ġclass ĠDataSource Id Ġ: ĠSerializable Ċ Ċ class ĠKey DataSource Id ( val Ġkey Ġ: ĠString ) Ġ: ĠDataSource Id () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġkey . equals ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġkey . hashCode () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠEmpty Data : ĠData Ċ Ċ abstract Ġclass ĠObservable Data < T >: ĠData { ĊĠĠĠ Ġabstract Ġval Ġobservable Ġ: ĠObservable < T > Ċ } Ċ Ċ interface ĠDataSource Ġ{ ĊĠĠĠ Ġval Ġid Ġ: ĠDataSource Id ĊĠĠĠ Ġval Ġitem : ĠData Ċ } Ċ Ċ interface ĠObservable DataSource < T >: ĠDataSource { ĊĠĠĠ Ġoverride Ġval Ġid : ĠDataSource Id ĊĠĠĠ Ġoverride Ġval Ġitem : ĠObservable Data < T > Ċ } Ċ interface ĠMod ifiable DataSource < T > Ġ: ĠObservable DataSource < T >{ ĊĠĠĠ Ġfun Ġupdate ( data Ġ: ĠT ) Ġ: ĠSingle < T > Ċ } Ċ class ĠObservable Data Impl < T >( override Ġval Ġobservable : ĠObservable < T >) Ġ: ĠObservable Data < T >() Ċ Ċ class ĠEmpty DataSource ( override Ġval Ġid : ĠDataSource Id Ġ= ĠDataSource Id (), Ġoverride Ġval Ġitem : ĠData Ġ= ĠEmpty Data ()) Ġ: ĠDataSource Ċ Ċ interface ĠDataSource Container { ĊĠĠĠ Ġfun Ġget DataSource ( dataSource Id : ĠDataSource Id ): ĠDataSource ? ĊĠĠĠ Ġfun Ġput DataSource ( dataSource : ĠDataSource ) Ċ } Ċ Ċ class ĠDataSource Container Impl Ġ: ĠDataSource Container Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= ĠHashMap < DataSource Id , ĠDataSource >() ĊĊĠĠĠ Ġoverride Ġfun Ġput DataSource ( dataSource : ĠDataSource ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmap . put ( dataSource . id , ĠdataSource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget DataSource ( dataSource Id Ġ: ĠDataSource Id ) Ġ: ĠDataSource ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap . get ( dataSource Id ) ĊĠĠĠ Ġ} Ċ } ĊĊ