/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠBe et le St ance Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . be et le stance . aph id . domain Ċ Ċ 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 . flatMap Latest Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġtim ber . log . Tim ber Ċ Ċ /** Ċ Ġ* ĠTo Ġbe Ġused Ġwhen Ġwe Ġjust Ġwant Ġto Ġobserve Ġstate Ġof Ġthe Ġwork Ġnot Ġthe Ġresult Ċ Ġ* Ċ Ġ* Ġas Ġ[ flow ] Ġis Ġcold Ġflow Ġthat Ġmeans Ġevery Ġnew Ġsubscriber Ġwill Ġexecute Ġthe Ġcode Ġagain . Ċ Ġ*/ Ċ abstract Ġclass ĠUse Case < in ĠP > Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( params : ĠP ): ĠFlow < Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Status . Started ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Work ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Status . Success ) ĊĠĠĠĠĠĠĠ Ġ}. catch Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Status . Error ( throwable )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( throwable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠWill Ġonly Ġbe Ġused Ġwhen Ġwe Ġknow Ġthe Ġresult Ġwill Ġbe Ġreturned Ġwithout Ġerrors ĊĠĠĠ Ġsuspend Ġfun Ġexecute Sync ( params : ĠP ): ĠUnit Ġ= Ġdo Work ( params ) ĊĊĠĠĠ Ġprotected Ġabstract Ġsuspend Ġfun Ġdo Work ( params : ĠP ) Ċ } Ċ Ċ /** Ċ Ġ* ĠTo Ġbe Ġused Ġwhen Ġwe Ġwant Ġthe Ġresult Ġfor Ġa Ġwork Ċ Ġ* Ċ Ġ* Ġ@ sample Ċ Ġ* Ġresult UseCase ( param ). first () Ġthis Ġwill Ġalso Ġauto Ġcancel s Ġthe Ġflow Ċ Ġ*/ Ċ abstract Ġclass ĠResult UseCase < in ĠP , Ġout ĠR > Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( params : ĠP ): ĠFlow < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( do Work ( params )) ĊĠĠĠĠĠĠĠ Ġ}. catch Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( throwable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġsuspend Ġfun Ġdo Work ( params : ĠP ): ĠR Ċ } Ċ Ċ /** Ċ Ġ* ĠTo Ġbe Ġused Ġfor Ġob serving Ġvalues Ġfrom Ġdatabase Ġor Ġany Ġsource Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġsubscribe Ġto Ġthe Ġflow Ċ Ġ* Ġobserve UseCase . observe (). collect { Ċ Ġ* ĠĠĠĠĠ Ġ# Ġdo Ġwork Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġset Ġthe Ġparameters Ġfor Ġcreating Ġobservable Ċ Ġ* Ġwe Ġcan Ġcall Ġthis Ġmultiple Ġtimes Ġwithout Ġsub scri bing Ġto Ġflow Ġagain Ċ Ġ* Ġobserve UseCase . invoke ( input ) Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ@ Warning ĠAlways Ġstart Ġob serving Ġbefore Ġinvoke Ċ Ġ*/ Ċ abstract Ġclass ĠOb serve UseCase < P Ġ: ĠAny , ĠT > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġparam State Ġ= ĠMutable Shared Flow < P >( ĊĠĠĠĠĠĠĠ Ġextra Buffer Capacity Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġon Buffer Overflow Ġ= ĠBuffer Overflow . DROP _ OL DEST ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke ( params : ĠP ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparam State . try Emit ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcreate Observable ( params : ĠP ): ĠFlow < T > ĊĊĠĠĠ Ġfun Ġobserve (): ĠFlow < T > Ġ= Ġparam State . flatMap Latest Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Observable ( it ). catch Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( throwable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠTo Ġbe Ġused Ġfor Ġperforming Ġsus pending Ġwork Ċ Ġ* Ċ Ġ* ĠUse Ġwhen Ġa Ġwork Ġneed Ġto Ġbe Ġexecuted Ġwith Ġdifferent Ġparams Ċ Ġ*/ Ċ abstract Ġclass ĠS uspend able Work UseCase < P Ġ: ĠAny , ĠT > Ġ: ĠOb serve UseCase < P , ĠT >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate Observable ( params : ĠP ): ĠFlow < T > Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġemit ( do Work ( params )) ĊĠĠĠ Ġ}. catch Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠ ĠTim ber . e ( throwable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġdo Work ( params : ĠP ): ĠT Ċ } Ċ Ċ operator Ġfun ĠUse Case < Unit >. invoke (): ĠFlow < Status > Ġ= Ġinvoke ( Unit ) Ċ operator Ġfun Ġ< T > ĠResult UseCase < Unit , ĠT >. invoke (): ĠFlow < T > Ġ= Ġinvoke ( Unit ) Ċ operator Ġfun Ġ< T > ĠOb serve UseCase < Unit , ĠT >. invoke (): ĠUnit Ġ= Ġinvoke ( Unit ) Ċ