/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠLe ah ĠN ich ita Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . fer elin . domain . inter actors Ċ Ċ import Ġcom . fer elin . domain . entities . Stock Price Ċ import Ġcom . fer elin . domain . repositories . Stock Price Repo Ċ import Ġcom . fer elin . domain . sources . Stock Price Source Ċ import Ġcom . fer elin . domain . utils . Stock Price Listener Ċ import Ġcom . fer elin . shared . Load State Ċ import Ġcom . fer elin . shared . NAMED _ EXTERNAL _ SCOPE Ċ import Ġcom . fer elin . shared . if Prepared Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Named Ċ import Ġjavax . inject . Singleton Ċ Ċ /** Ċ Ġ* Ġ[ Stock Price Interactor ] Ġallows Ġto Ġinteract Ġwith Ġcompanies Ġstock Ġprice Ċ Ġ* Ġ*/ Ċ @ Singleton Ċ class ĠStock Price Interactor Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġstock Price Repo : ĠStock Price Repo , ĊĠĠĠ Ġprivate Ġval Ġstock Price Source : ĠStock Price Source , ĊĠĠĠ Ġprivate Ġval Ġprice Listeners : ĠList < @ Jvm Suppress W ild cards ĠStock Price Listener >, ĊĠĠĠ Ġ@ Named ( NAMED _ EXTERNAL _ SCOPE ) Ġprivate Ġval Ġexternal Scope : ĠCor outine Scope Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠÐķ o Ġreceive Ġanswers Ġto Ġrequests Ġfor Ġobtaining Ġthe Ġcurrent Ġprice ĊĠĠĠĠ Ġ* Ġ@ return Ġflow Ġof Ġ[ Load State ] Ġwith Ġ[ Stock Price ] Ġif Ġ[ Load State ] Ġis Ġsuccessful ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġobserve Actual Stock Price Responses (): ĠFlow < Load State < Stock Price >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstock Price Source ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe Actual Stock Price Responses () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġcache If Prepared ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġto Ġadd Ġrequest Ġto Ġload Ġactual Ġstock Ġprice Ġfor Ġcompany ĊĠĠĠĠ Ġ* Ġ@ param Ġcompany Id Ġis Ġa Ġcompany Ġfor Ġwhich Ġneed Ġto Ġload Ġstock Ġprice ĊĠĠĠĠ Ġ* Ġ@ param Ġcompany Ticker Ġis Ġa Ġcompany Ġticker Ġfor Ġwhich Ġneed Ġto Ġload Ġstock Ġprice ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Position Ġis Ġa Ġposition Ġwhich Ġdetermines Ġthe Ġ" import ance " Ġof Ġthe Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param Ġis Important Ġif Ġtrue Ġguarantees Ġthe Ġexecution Ġof Ġthe Ġrequest ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġadd Request To Get Stock Price ( ĊĠĠĠĠĠĠĠ Ġcompany Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġcompany Ticker : ĠString , ĊĠĠĠĠĠĠĠ Ġkey Position : ĠInt , ĊĠĠĠĠĠĠĠ Ġis Important : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstock Price Source . add Request To Get Stock Price ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompany Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompany Ticker , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Position , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Important ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcache If Prepared ( load State : ĠLoad State < Stock Price >) Ġ{ ĊĠĠĠĠĠĠĠ Ġload State . if Prepared Ġ{ Ġprepared State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstock Price Repo . insert ( prepared State . data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprice Listeners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Stock Price Changed ( prepared State . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }