package com.github.salomonbrys.kodein.bindings import com.github.salomonbrys.kodein.* import kotlinx.coroutines.experimental.Deferred import kotlinx.coroutines.experimental.async import kotlin.coroutines.experimental.CoroutineContext inline fun Kodein.Builder.deferredSingleton( coroutineContext: CoroutineContext, noinline creator: NoArgBindingKodein.() -> T ) = EagerSingletonBinding(this, generic(), { async(coroutineContext) { creator() } }) inline fun KodeinInjectedBase.awaitInstance(tag: Any? = null) = injector.AwaitInstance(generic(), tag) fun KodeinInjector.AwaitInstance(type: TypeToken, tag: Any? = null): InjectedProperty = _register(InjectedInstanceProperty(Kodein.Bind(type, tag))) class InjectedInstanceProperty>(bind: Kodein.Bind) : InjectedProperty(Kodein.Key(bind, UnitToken)) { @Suppress("UNCHECKED_CAST") override fun _getInjection(container: KodeinContainer) = container.nonNullProvider(key.bind).invoke() as T override val _type = "instance" }