package Ġli j ew ski . de mod b . domain . common Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ type alias ĠCompletion Block < T > Ġ= ĠBase UseCase . Request < T >. () Ġ-> ĠUnit Ċ Ċ abstract Ġclass ĠBase UseCase < T >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġparent Job : ĠJob Ġ= ĠJob () ĊĠĠĠ Ġvar Ġbackground Context : ĠCor outine Context Ġ= ĠDispatch ers . IO ĊĠĠĠ Ġvar Ġforeground Context : ĠCor outine Context Ġ= ĠDispatch ers . Main ĊĊĠĠĠ Ġprotected Ġabstract Ġsuspend Ġfun Ġexecute On Background (): ĠT ĊĊĠĠĠ Ġfun Ġexecute ( block : ĠCompletion Block < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠRequest < T >(). apply Ġ{ Ġblock () Ġ} ĊĠĠĠĠĠĠĠ Ġunsubscribe () ĊĠĠĠĠĠĠĠ Ġparent Job Ġ= ĠJob () ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( foreground Context Ġ+ Ġparent Job ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġwith Context ( background Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute On Background () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunsubscribe () Ġ{ ĊĠĠĠĠĠĠĠ Ġparent Job . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Children () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠRequest < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠonComplete : Ġ(( T ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠonError : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġon Cancel : Ġ(( Cancellation Exception ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠonComplete ( block : Ġ( T ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠonError ( block : Ġ( Throwable ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Cancel ( block : Ġ( Cancellation Exception ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancel Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( result : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete ?. invoke ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ?. invoke ( throwable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( error : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancel ?. invoke ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ