package Ġcom . demo . just app . ex ch anger . domain Ċ Ċ import Ġcom . demo . just app . ex ch anger . di . scope . C urrencies Ċ import Ġcom . demo . just app . ex ch anger . domain . model . Currency Rate Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . functions . Function Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . text . NumberFormat Ċ import Ġjavax . inject . Inject Ċ Ċ @ C urrencies Ċ class ĠCurrency Rates Calculator Ġ@ Inject Ġconstructor () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġformatter : ĠNumber Format Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnumber Format Ġ= ĠNumber Format . getNumber Instance () ĊĠĠĠĠĠĠĠ Ġnumber Format . is Grouping Used Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġnumber Format . maximum Fraction Digits Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġnumber Format . minimum Fraction Digits Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn @ lazy Ġnumber Format ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate ( currencies : ĠList < Currency Rate >, Ġcourse : ĠBigDecimal ): ĠSingle < List < Currency Rate >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . from Iterable ( currencies ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Single ( calculate Rate Internal ( course )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Single ( format Rate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Rate Internal ( course : ĠBigDecimal ): ĠFunction < Currency Rate , ĠSingle < Currency Rate >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFunction Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . course Ġ= Ġcurrent . course . multiply ( course ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( current ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Rate (): ĠFunction < Currency Rate , ĠSingle < Currency Rate >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFunction Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . course Ġ= Ġformat Localized BigDecimal Value ( current . course ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( current ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Localized BigDecimal Value ( input : ĠBigDecimal ): ĠBigDecimal Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġformatter . format ( input ). replace (",", Ġ". "). to BigDecimal () ĊĠĠĠ Ġ} Ċ Ċ }