package Ġmk . web factory . dz . converter . currency . core Ċ Ċ /** Ċ Ġ* ĠCalculates Ġthe Ġexchange Ġrate Ġof Ġone Ġcurrency Ġto Ġanother Ġusing Ġthe Ġprovided Ġexchange Ġrates . Ċ Ġ*/ Ċ internal Ġinterface ĠRate Calculator Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe Ġexchange Ġrate Ġof Ġone Ġcurrency Ġto Ġanother Ġusing Ġthe Ġprovided Ġexchange Ġrates . ĊĠĠĠĠ Ġ* ĠIf Ġdirect Ġconversion Ġpath Ġdoes Ġnot Ġexist Ġin Ġa Ġsingle Ġ[ Exchange Rate Data ] Ġthe Ġcalculator ĊĠĠĠĠ Ġ* Ġmay Ġtry Ġto Ġfind Ġa Ġpath Ġthrough Ġmultiple Ġexchange Ġrates . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Conversion Result ] Ġor Ġnull Ġif Ġconversion Ġpath Ġcould Ġnot Ġbe Ġfound . ĊĠĠĠĠ Ġ* ĠThe Ġnull Ġresult Ġis Ġjust ified Ġbecause Ġchecking Ġif Ġthe Ġrate Ġis Ġavailable Ġtakes Ġequal Ġwork Ġas ĊĠĠĠĠ Ġ* Ġcalculating Ġit Ġand Ġcould Ġbe Ġan Ġexpensive Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcalc ( pair : ĠFrom To Currency Pair , Ġexchange Rates : ĠList < Exchange Rate Data >): ĠConversion Result ? Ċ } Ċ Ċ // Very Ġd umb Ġand Ġlazy ĠRate Calculator Ċ internal Ġclass ĠBasic Rate Calculator Ġ: ĠRate Calculator Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcalc ( pair : ĠFrom To Currency Pair , Ġexchange Rates : ĠList < Exchange Rate Data >): ĠConversion Result ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠdataSet : ĠList < Exchange Rate Data > Ġ= Ġwhen Ġ( pair . from . preferred Conversion Base ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġexchange Rates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexchange Rates . sorted With ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComparator Ġ{ Ġa , Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . base Ġ== Ġpair . from . preferred Conversion Base Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . base Ġ== Ġpair . from . preferred Conversion Base Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( rate Data Ġin ĠdataSet ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rate Data . base Ġ== Ġpair . from ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rate Data . rates . containsKey ( pair . to )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconversion Result ( rate Data . rates [ pair . to ] !! , Ġpair , Ġrate Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rate Data . base Ġ== Ġpair . to ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rate Data . rates . containsKey ( pair . from )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconversion Result ( rate Data . rates [ pair . from ] !!. invert (), Ġpair , Ġrate Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rate Data . rates . containsKey ( pair . from ) Ġ&& Ġrate Data . rates . containsKey ( pair . to )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrate Ġ= Ġrate Data . rates [ pair . to ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( rate Data . rates [ pair . from ] !!. invert (). middle Rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconversion Result ( rate , Ġpair , Ġrate Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠRate Not Available Exception () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconversion Result ( rate : ĠRate , Ġpair : ĠFrom To Currency Pair , Ġdata : ĠExchange Rate Data ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConversion Result ( pair . from , Ġpair . to , Ġdata . base , Ġdata . timestamp Utc , Ġrate ) Ċ }