Skip to content

Instantly share code, notes, and snippets.

View klukwist's full-sized avatar

Aleksei Cherniaev klukwist

View GitHub Profile
interface A {
fun foo()
}
class AImpl: A {
override fun foo() {
print("A")
}
}
val aInstance = get<A>() // or val aInstance: A = get()
val bInstance = get<B>()
val cInstance = get<C> {
params(bInstance)
}
@PublishedApi
internal object SimpleDiStorage {
val instances = mutableMapOf<KClass<*>, InstanceType<*>>()
inline fun <reified T : Any> addFactory(factory: InstanceType<T>) {
check(instances[T::class] == null) {
"Definition for ${T::class} already added."
}
instances[T::class] = factory
}
inline fun <reified T : Any> get(noinline params: (Params.() -> Unit)? = null): T {
return SimpleDiStorage.getInstance(params)
}
object SimpleDiScope {
inline fun <reified T : Any> factory(factory: InstanceType.Factory<T>) {
SimpleDiStorage.addFactory(factory)
}
inline fun <reified T : Any> factoryWithParams(factory: InstanceType.ParamFactory<T>) {
SimpleDiStorage.addFactory(factory)
}
inline fun <reified T : Any> singleton(factory: InstanceType.Factory<T>) {
fun module(scope: SimpleDiScope.() -> Unit) {
scope.invoke(SimpleDiScope)
}
interface RegularFoo {
fun bar() : String
}
val regularFoo = object : RegularFoo {
override fun bar(): String {
return "hello world"
}
}
fun interface SamFoo {
fun bar() : String
}
val samFoo = SamFoo {
"hello world"
}
samFoo.bar()