package Ġz lc . season . s ange Ċ Ċ import Ġandroid . os . Looper Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers . IO Ċ import Ġkotlinx . coroutines . Dispatch ers . Main Ċ import Ġkotlinx . coroutines . launch Ċ Ċ internal Ġfun Ġ< T > ĠT ?. clean Up Item () Ġ{ ĊĠĠĠ Ġthis ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠClean able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . clean Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġ< T > ĠList < T >. clean Up () Ġ{ ĊĠĠĠ Ġthis . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġit . clean Up Item () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġis MainThread (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠL ooper . get Main Looper (). thread Ġ=== ĠThread . currentThread () Ċ } Ċ Ċ internal Ġfun ĠCor outine Scope . ensure MainThread ( block : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġif Ġ( is MainThread ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch ( Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġ< T > Ġassert MainThread With Result ( block : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġif Ġ( is MainThread ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġblock () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" This Ġoperation Ġonly Ġsupports Ġthe ĠMain Ġthread Ġcall !") ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠCor outine Scope . launch Io ( block : Ġsuspend Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġlaunch ( IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠCor outine Scope . launch Main ( block : Ġsuspend Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġlaunch ( Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} Ċ } Ċ