package Ġcom . l cy er . sw it . domain ĊĊ Ċ import Ġcom . l cy er . sw it . result . Result Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ /** Ċ Ġ* ĠExec utes Ġbusiness Ġlogic Ġsynchronous ly Ġor Ġasynchronously Ġusing ĠCor outines . Ċ Ġ*/ Ċ abstract Ġclass ĠUse Case < in ĠP , ĠR >( ĊĠĠĠ Ġprivate Ġval Ġcoroutine Dispatcher : ĠCor outine Dispatcher Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĠExec utes Ġthe Ġuse Ġcase Ġasynchronously Ġand Ġreturns Ġa Ġ[ Result ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġ[ Result ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparameters Ġthe Ġinput Ġparameters Ġto Ġrun Ġthe Ġuse Ġcase Ġwith ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġoperator Ġfun Ġinvoke ( parameters : ĠP ): ĠResult < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMoving Ġall Ġuse Ġcase 's Ġexecution s Ġto Ġthe Ġinjected Ġdispatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġproduction Ġcode , Ġthis Ġis Ġusually Ġthe ĠDefault Ġdispatcher Ġ( background Ġthread ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġtests , Ġthis Ġbecomes Ġa ĠTest Coroutine Dispatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( coroutine Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute ( parameters ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Success ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverride Ġthis Ġto Ġset Ġthe Ġcode Ġto Ġbe Ġexecuted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( RuntimeException :: class ) ĊĠĠĠ Ġprotected Ġabstract Ġsuspend Ġfun Ġexecute ( parameters : ĠP ): ĠR Ċ }