package Ġorg . open rnd r Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġmu . Kotlin Logging Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊ Ċ private Ġvar Ġlast Run Time Ġ= Ġ- 1 L Ċ Ċ @ Opt In ( Internal Cor outines Api :: class ) Ċ actual Ġclass ĠDispatcher Ġ: ĠMain Coroutine Dispatcher (), ĠDelay Ġ{ ĊĠĠĠ Ġprivate Ġval Ġto Run Ġ= Ġmutable ListOf < Runnable >() ĊĠĠĠ Ġprivate Ġval Ġto Run After Ġ= Ġmutable ListOf < Pair < Long , ĠRunnable >>() ĊĠĠĠ Ġprivate Ġval Ġto Continue After Ġ= Ġmutable ListOf < Pair < Long , ĠC ancellable Continuation < Unit >> >() ĊĊĊĠĠĠ Ġoverride Ġfun Ġis Dispatch Needed ( context : ĠCor outine Context ): ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Main Coroutine Dispatcher " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġschedule Resume After Delay ( time Millis : ĠLong , Ġcontinuation : ĠC ancellable Continuation < Unit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( to Continue After ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" schedule Resume Ġ$ time Millis Ġ$ continu ation " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Continue After . add ( Pair ( System . currentTimeMillis () Ġ+ Ġtime Millis , Ġcontinuation )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġval Ġimmediate : ĠMain Coroutine Dispatcher ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch ( context : ĠCor outine Context , Ġblock : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( to Run ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" dispatch ing Ġ$ block " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Run . add ( block ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Run Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġsynchronized ( to Run ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= Ġto Run Ġ+ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Run . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" running Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġsynchronized ( to Run After ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Do Ġ= Ġto Run After . filter Ġ{ Ġit . first Ġ<= Ġtime Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! to Do . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Run After . removeAll Ġ{ Ġit . first Ġ<= Ġtime Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġrunnable ) Ġin Ġto Do ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" running Ġ$ run nable " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunnable . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsynchronized ( to Continue After ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Do Ġ= Ġto Continue After . filter Ġ{ Ġit . first Ġ<= Ġtime Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Do . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Continue After . removeAll Ġ{ Ġit . first Ġ<= Ġtime Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġcontinuation ) Ġin Ġto Do ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( continu ation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" res uming Ġ$ continu ation " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" EXPERIMENT AL _ API _ USAGE ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresume Un dis patched ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġthrottle ( time Millis : ĠLong ) Ġ{ ĊĠĠĠ Ġif Ġ(( System . currentTimeMillis () Ġ- Ġlast Run Time ) Ġ> Ġtime Millis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelay ( 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" EXPERIMENT AL _ API _ USAGE ") Ċ fun ĠDispatcher . launch ( start : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit Ċ ): ĠJob Ġ= ĠGlobal Scope . launch ( this , Ġstart , Ġblock ) ĊĊ