Francesc
07/09/2024, 2:45 AMCompletableDeferred
but I could not quite get it to work.Francesc
07/09/2024, 2:45 AMdata class Task(/* ... */)
data class Result(/* ... */)
data class TaskWrapper(
val id: Int,
val task: Task
)
data class ResultWrapper(
val id: Int,
val result: Result,
)
class Sample {
val counter = AtomicInt(0)
val taskQueue = MutableSharedFlow<TaskWrapper>(
extraBufferCapacity = 1,
onBufferOverlow = BufferOverflow.DROP_OLDEST,
)
val resultQueue = MutableSharedFlow<ResultWrapper>(
extraBufferCapacity = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST,
replay = 1,
)
init {
scope.launch {
taskQueue
.map { processTask(it) }
.collectLastest { result -> resultQueue.tryEmit(result) }
}
}
fun trigger(task: Task) {
taskQueue.trySend(
TaskWrapper(counter.getAndIncrement(), task)
)
}
suspend fun getResult() {
return taskQueue
.filter { it.id == counter.get() }
.first()
.result
}
suspend fun process(taskWrapper: TaskWrapper): ResultWrapper {
/* ... */
return ResultWrapper(id = taskWrapper.id, result = result)
}
}
Sam
07/09/2024, 9:38 AMclass Sample {
lateinit var latest: Deferred<Result>
fun trigger(task: Task) {
latest = scope.async { process(task) }
}
suspend fun getResult() = latest.await()
suspend fun process(task: Task): Result = TODO("process task")
}
Francesc
07/09/2024, 3:40 PM