Skip to content

Instantly share code, notes, and snippets.

@httpdispatch
Created March 26, 2024 12:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save httpdispatch/a5ad8ee6a762d71d2f6d128a7e65b3e6 to your computer and use it in GitHub Desktop.
Save httpdispatch/a5ad8ee6a762d71d2f6d128a7e65b3e6 to your computer and use it in GitHub Desktop.
class Context
interface Module1 {
val dep1: () -> Int
val dep2: String
data class Deps(
val context: Context,
)
private class Impl(val deps: () -> Deps) : Module1 {
override val dep1: () -> Int = { 42 }
override val dep2: String
get() = "M1Dep2 Impl " + deps().context
}
companion object : (() -> Deps) -> Module1 by { Impl(it) }
}
interface Module2 {
val dep3: String
data class Deps(
val dep1: () -> Int,
val context: Context,
)
private class Impl(val deps: () -> Deps) : Module2 {
override val dep3: String
get() = deps().run {
"M2" + dep1() + context + "m2"
}
}
companion object : (() -> Deps) -> Module2 by { Impl(it) }
}
interface FeatureModule1 {
val f1dep: String
data class Deps(
val dep2: String,
val dep3: String,
)
class Holder(deps: () -> Deps) : () -> FeatureModule1 by { Impl(deps) }
companion object : (() -> Deps) -> FeatureModule1 by { Impl(it) } {
private class Impl(val deps: () -> Deps) : FeatureModule1 {
override val f1dep: String
get() = deps().run {
"F1$dep2$dep3"
}
}
}
}
interface FeatureModule2 {
val f2dep: String
data class Deps(
val dep2: String,
val dep3: String,
)
class Holder(deps: () -> Deps) : () -> FeatureModule2 by { Impl(deps) }
companion object : (() -> Deps) -> FeatureModule2 by { Impl(it) } {
private class Impl(val deps: () -> Deps) : FeatureModule2 {
override val f2dep: String
get() = deps().run {
"F2$dep2$dep3"
}
}
}
}
class AppComponent constructor(
val context: Context,
) {
val module1 = Module1 { Module1.Deps(context = context) }
val module2 = Module2 {
Module2.Deps(
dep1 = module1.dep1,
context = context
)
}
val featureModule1Holder = FeatureModule1.Holder {
FeatureModule1.Deps(
dep2 = module1.dep2,
dep3 = module2.dep3
)
}
val featureModule2Holder = FeatureModule2.Holder {
FeatureModule2.Deps(
dep2 = module1.dep2,
dep3 = module2.dep3
)
}
}
val c = AppComponent(context = Context())
println("Start")
println(c.module1.dep1())
println(c.module1.dep2)
println(c.module2.dep3)
println(c.featureModule1Holder().f1dep)
println(c.featureModule2Holder().f2dep)
println("End")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment