janos
07/24/2018, 5:51 PMLuke
07/24/2018, 5:53 PMfun withContext(block: (Context) -> Unit){}
janos
07/24/2018, 5:54 PMLuke
07/24/2018, 5:54 PMblock()
inside to executejanos
07/24/2018, 5:56 PMLuke
07/24/2018, 5:57 PMblock(context)
janos
07/24/2018, 5:58 PMLuke
07/24/2018, 5:58 PMjanos
07/24/2018, 6:00 PMLuke
07/24/2018, 6:01 PMkarelpeeters
07/24/2018, 6:01 PMjanos
07/24/2018, 6:03 PMLuke
07/24/2018, 6:04 PMjanos
07/24/2018, 6:04 PMLuke
07/24/2018, 6:06 PMkarelpeeters
07/24/2018, 6:06 PMclass ServiceFooFactory {
...
fun createWithContext(context: Context, block: ServiceFoo.() -> Unit): ServiceFoo {
val service = createServiceFoo(context)
service.block()
return service
}
}
val service = factory.createWithContext(context) { hello("Bar") }
Luke
07/24/2018, 6:07 PMjanos
07/24/2018, 6:09 PMfactory.createWithContext {context -> hello("Bar") }
Luke
07/24/2018, 6:11 PMfun withContext(block: (Context) -> Unit){block(baseClient.context)}
?janos
07/24/2018, 6:12 PMfun someFun(callParam, context) {
factory.createServiceFoo(context).hello(callParam)
}
fun someFun(callParam, context) {
factory.createWithContext(context) {
hello(callParam)
}
}
fun someFun(callParam, context) {
factory.createWithContext { context ->
hello(callParam)
}
}
karelpeeters
07/24/2018, 6:18 PMcontext
as a parameter"?janos
07/24/2018, 6:18 PMkarelpeeters
07/24/2018, 6:21 PMjanos
07/24/2018, 6:21 PMkarelpeeters
07/24/2018, 6:49 PMcontext
in { context -> ... }
is normally a parameter, but you want it it be a value, ie. an argument..janos
07/24/2018, 6:51 PMfun <R> with(context: Context, block: Api.() -> R): R {
val service = Api(baseClinet.addHeader(context))
return service.block()
}
val retVal: String = serviceFoo.with(HttpContext) { hello("WithContext") }
karelpeeters
07/24/2018, 6:54 PMjanos
07/24/2018, 6:56 PMkarelpeeters
07/24/2018, 6:56 PMjanos
07/24/2018, 6:57 PMclass ServiceFoo {
private val baseClient = Client()
internal fun <R> with(context: Context, block: Api.() -> R): R {
val service = Api(baseClient.addHeader(context))
return service.block()
}
internal class Api(private val enhancedClient: Client) {
fun hello(name: String): String {
enhancedClient.getMethod(name)
return name
}
fun hello2(name: String): Int {
enhancedClient.getMethod(name)
return 2
}
}
}
fun main(args: Array<String>) {
val serviceFoo = ServiceFoo()
val retVal: Int = serviceFoo.with(HttpContext) {
hello2("WithContext")
}
}
ServiceFooFactory
and the Api
as ServiceFoo
internal fun <R> with(context: Context, block: Api.() -> R): R = Api(baseClient.addHeader(context)).run(block)
karelpeeters
07/24/2018, 7:57 PM