package Ġai . prom oted . calculation Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ /** Ċ Ġ* ĠAllows Ġyou Ġto Ġdefine Ġwhat Ġthread /[ Coroutine Context ] Ġyou Ġwant Ġan Ġoperation Ġto Ġbe Ġexecuted Ġupon , Ċ Ġ* Ġand Ġthen Ġguarantee Ġsequential Ġexecution Ġof Ġthat Ġoperation Ġon Ġsubsequent Ġcalls . Ċ Ġ*/ Ċ internal Ġclass ĠAsync Calculation Runner ( ĊĠĠĠ Ġprivate Ġval Ġcalculation Context : ĠCor outine Context Ġ= ĠDispatch ers . Default , ĊĠĠĠ Ġprivate Ġval Ġnotification Context : ĠCor outine Context Ġ= Ġcalculation Context Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( calculation Context ) ĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġfun Ġ< Input , ĠOutput > Ġschedule Calculation ( ĊĠĠĠĠĠĠĠ Ġinput : ĠInput , ĊĠĠĠĠĠĠĠ Ġcalculation : Ġ( input : ĠInput ) Ġ-> ĠOutput , ĊĠĠĠĠĠĠĠ Ġon Result : Ġ( output : ĠOutput ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġcalculation . invoke ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( notification Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Result . invoke ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ