Sam
11/23/2018, 6:02 AMWorker.execute
method at all, I'm confronted with:
kotlin.native.concurrent.Worker.execute must take an unbound, non-capturing function or lambda
olonho
11/23/2018, 6:07 AMolonho
11/23/2018, 6:07 AMSam
11/23/2018, 6:31 AMclass WorkerManager() {
internal val readwriteWorker = Worker.start()
internal var readwriteDB = Database.open(path)
fun readWriteAsync(job: (db) -> String) {
readwriteWorker.execute(TransferMode.SAFE, { readwriteDB }, job)
}
}
If I understand correctly, I would need to call the producer function and detach it's results as well has the job function itself and then reattach them inside of my own worker job block?Sam
11/23/2018, 6:44 AMinternal val readwriteWorker = Worker.start()
internal var readwriteDB = Database.open(path)
fun <T1, T2>readWriteAsync(producer: ()->T1, job: (T1) -> T2): Future<T2> {
val inputPtr = DetachedObjectGraph {
Pair(producer(), job)
}.asCPointer()
return readwriteWorker.execute(TransferMode.SAFE, { inputPtr }) { ptr ->
val result = DetachedObjectGraph<Pair<T1, (T1) -> T2>>(ptr).attach()
result.second(result.first)
}
}
olonho
11/23/2018, 7:01 AMdata class Input(var int: Int)
data class Output(var string: String)
inline fun <reified T, reified R> Worker.executeAsync(crossinline producerConsumer: () -> Pair<T, (T) -> R>): Future<R> =
execute(TransferMode.SAFE, { producerConsumer() }) { it -> it.second(it.first) }
fun main() {
val worker = Worker.start()
val future = worker.executeAsync { Pair<Input, (Input) -> Output>(Input(42), { input ->
<http://input.int|input.int>++
Output(input.int.toString())
})}
println(future.result)
}
shall doSam
11/24/2018, 6:03 AMolonho
11/24/2018, 6:28 AMfreeze
will affect the job you passed. I’d suggest smth similar to approach above.Sam
11/24/2018, 6:53 AMolonho
11/24/2018, 7:15 AMolonho
11/24/2018, 7:15 AMdata class Input(var int: Int)
class Box<T>(boxed: T) {
private var value_: T? = boxed
val value: T get() {
val result = value_!!
value_ = null
return result
}
}
inline fun <reified T, reified R> Worker.executeAsync(data: Box<T>, crossinline consumerMaker: () -> ((T) -> R)): Future<R> =
execute(TransferMode.SAFE, {
Pair(data.value, consumerMaker())
}) { it -> it.second(it.first) }
fun main() {
val worker = Worker.start()
val boxedInput = { Box(Input(42)) } ()
val future = worker.executeAsync(boxedInput) { { input: Input ->
<http://input.int|input.int>++
input
} }
println(future.result)
}