/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠR Äĥ z van ĠRo È Ļ u Ċ Ġ* Ċ Ġ* Ġ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 Ġapp . sed ici . tasks . domain Ċ Ċ import Ġapp . sed ici . tasks . base . common . Invoke Error Ċ import Ġapp . sed ici . tasks . base . common . Invoke Started Ċ import Ġapp . sed ici . tasks . base . common . Invoke Status Ċ import Ġapp . sed ici . tasks . base . common . Invoke Success Ċ import Ġkotlinx . coroutines . channels . Buffer Overflow Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable Shared Flow Ċ import Ġkotlinx . coroutines . flow . catch Ċ import Ġkotlinx . coroutines . flow . distinct Until Changed Ċ import Ġkotlinx . coroutines . flow . flatMap Latest Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . with Timeout Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ abstract Ġclass ĠInter actor < in ĠParams > Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( params : ĠParams , Ġtimeout Ms : ĠLong Ġ= Ġdefault Timeout Ms ): ĠFlow < Invoke Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Timeout ( timeout Ms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Invoke Started ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Work ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Invoke Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. catch Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Invoke Error ( t )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġexecute Sync ( params : ĠParams ) Ġ= Ġdo Work ( params ) ĊĊĠĠĠ Ġprotected Ġabstract Ġsuspend Ġfun Ġdo Work ( params : ĠParams ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdefault Timeout Ms Ġ= ĠTimeUnit . MIN UTES . to Millis ( 5 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠResult Interactor < in ĠP , ĠR > Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( params : ĠP ): ĠFlow < R > Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġemit ( do Work ( params )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġexecute Sync ( params : ĠP ): ĠR Ġ= Ġdo Work ( params ) ĊĊĠĠĠ Ġprotected Ġabstract Ġsuspend Ġfun Ġdo Work ( params : ĠP ): ĠR Ċ } Ċ Ċ abstract Ġclass ĠSubject Interactor < P Ġ: ĠAny , ĠT > Ġ{ ĊĠĠĠ Ġ// ĠIde ally Ġthis Ġwould Ġbe Ġbuffer Ġ= Ġ 0 , Ġsince Ġwe Ġuse Ġflat Map Latest Ġbelow , ĠBUT Ġinvoke Ġis Ġnot ĊĠĠĠ Ġ// Ġsus pending . ĠThis Ġmeans Ġthat Ġwe Ġcan 't Ġsuspend Ġwhile Ġflat Map Latest Ġcancel s Ġany ĊĠĠĠ Ġ// Ġexisting Ġflows . ĠThe Ġbuffer Ġof Ġ 1 Ġmeans Ġthat Ġwe Ġcan Ġuse Ġtry Emit () Ġand Ġbuffer Ġthe Ġvalue ĊĠĠĠ Ġ// Ġinstead , Ġresulting Ġin Ġmostly Ġthe Ġsame Ġresult . ĊĠĠĠ Ġprivate Ġval Ġparam State Ġ= ĠMutable Shared Flow < P >( ĊĠĠĠĠĠĠĠ Ġreplay Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġextra Buffer Capacity Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġon Buffer Overflow Ġ= ĠBuffer Overflow . DROP _ OL DEST ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġflow : ĠFlow < T > Ġ= Ġparam State ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠ Ġ. flatMap Latest Ġ{ Ġcreate Observable ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke ( params : ĠP ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparam State . try Emit ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcreate Observable ( params : ĠP ): ĠFlow < T > Ċ } Ċ