/** Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠF ern ando ĠC ej as ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 . example . library _ base . domain . user case Ċ Ċ import Ġcom . example . library _ base . domain . exception . Failure Ċ import Ġcom . example . library _ base . domain . utility . Either Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ /** Ċ Ġ* ĠA Ġabstract Ġclass Ġthat Ġcan Ġbe Ġextends Ġto Ġdefine Ġa Ġuse Ġcase Ġto Ġrun Ġin Ġprovided Ġthread . Ċ Ġ* Ċ Ġ* Ġ@ param ĠType ĠReturn Ġtype Ġwhen Ġextended Ġuse Ġcase Ġinvoke Ġsuccessfully . Ċ Ġ* Ġ@ param ĠParams ĠParameters Ġthat Ġwill Ġbe Ġused Ġin Ġside Ġmember Ġrun Ġfunction . Ċ Ġ* Ċ Ġ* Ġ@ property Ġdefault Dispatcher ĠThe Ġthread Ġthat Ġthe Ġuse Ġcase Ġwill Ġbe Ġrunning Ġin . Ċ Ġ*/ Ċ abstract Ġclass ĠUse Case < out ĠType , Ġin ĠParams >( ĊĠĠĠ Ġvar Ġdefault Dispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . IO Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTo Ġuse ĠUse Case , Ġthe Ġclient Ġmust Ġprovide Ġhow Ġthe Ġimplemented ĠUse Case Ġexecute . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġrun ( params : ĠParams ): ĠEither < Type , ĠFailure > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBy Ġoverriding Ġthe Ġinvoke Ġfunction , Ġthe Ġclient Ġcan Ġsimply Ġcall ĠUse Case ( params ) Ġ{ Ġ... Ġ} ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams ĠParameters Ġthat Ġshould Ġbe Ġre - directed Ġto Ġits Ġown Ġrun Ġmember Ġfunction . ĊĠĠĠĠ Ġ* Ġ@ param Ġon Result ĠCallback Ġfunction Ġthat Ġwill Ġbe Ġcalled Ġwhen Ġuse Ġcase Ġcomplete . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġoperator Ġfun Ġinvoke ( params : ĠParams , Ġon Result : Ġ( Either < Type , ĠFailure >) Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġwith Context ( default Dispatcher ) Ġ{ Ġreturn @ with Context Ġrun ( params ) Ġ} ĊĠĠĠĠĠĠĠ Ġon Result ( job ) ĊĠĠĠ Ġ} Ċ }