Я написал следующий код для базового варианта использования, если у вас будут похожие обратные вызовы, и вы хотите знать, когда они все сработали.
Оборачивает обратные вызовы и отслеживает их прогресс:
//Triggers a callback when all supplied callbacks have been called at least once
class CallbackLatch(
private val numberOfCallbacks: Int,
private val callback: () -> Unit
) {
private var autoIdCounter = 0
private val progress = mutableMapOf<Int, Int>()
fun <T> track(function: (input: T) -> Unit): (input: T) -> Unit {
val callbackId = autoIdCounter++
progress.putIfAbsent(callbackId, 0)
return {
function(it)
updateProgress(callbackId)
}
}
private fun updateProgress(id: Int) {
progress.apply {
this[id] = 1 + this.getOrElse(id) {0}
if (values.all { it > 0 } && values.size >= numberOfCallbacks) {
callback()
}
}
}
}
Я хочу избежать написания нескольких трековых методов, таких как:
fun <T> track(function: (input: T) -> Unit): (input: T) -> Unit
fun <T, U> track(function: (i1: T, i2: U) -> Unit): (i1: T, i2: U) -> Unit
fun <T, U ,V> track(function: (i1: T, i2: U, i3: V) -> Unit): (i1: T, i2: U, i3: V) -> Unit
Возможно ли это и какой будет сигнатура метода для метода track? (Извините, если это дубликат, я не смог его найти)