/* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines import kotlin.coroutines.* public actual object Dispatchers { public actual val Default: CoroutineDispatcher = createDefaultDispatcher() public actual val Main: MainCoroutineDispatcher get() = injectedMainDispatcher ?: mainDispatcher public actual val Unconfined: CoroutineDispatcher = kotlinx.coroutines.Unconfined private val mainDispatcher = JsMainDispatcher(Default, false) private var injectedMainDispatcher: MainCoroutineDispatcher? = null @PublishedApi internal fun injectMain(dispatcher: MainCoroutineDispatcher) { injectedMainDispatcher = dispatcher } } private class JsMainDispatcher( val delegate: CoroutineDispatcher, private val invokeImmediately: Boolean ) : MainCoroutineDispatcher() { override val immediate: MainCoroutineDispatcher = if (invokeImmediately) this else JsMainDispatcher(delegate, true) override fun isDispatchNeeded(context: CoroutineContext): Boolean = !invokeImmediately override fun dispatch(context: CoroutineContext, block: Runnable) = delegate.dispatch(context, block) override fun dispatchYield(context: CoroutineContext, block: Runnable) = delegate.dispatchYield(context, block) override fun toString(): String = toStringInternalImpl() ?: delegate.toString() }