// WITH_STDLIB fun diContext(context: C): DIContext = DIContext(TypeToken(), context) fun diContext(getContext: () -> C): DIContext = DIContext(TypeToken()) { getContext() } interface DIContext { val type: TypeToken val value: C fun print() { result += value.toString() } data class Value(override val type: TypeToken, override val value: C) : DIContext class Lazy(override val type: TypeToken, public val getValue: () -> C) : DIContext { override val value: C by lazy(getValue) } companion object { operator fun invoke(type: TypeToken, value: C): DIContext = Value(type, value) operator fun invoke(type: TypeToken, getValue: () -> C): DIContext = Lazy(type, getValue) } } class TypeToken var result = "" fun box(): String { diContext("O").print() diContext { "K" }.print() return result }