Оберните любой тип функции в Kotlin - PullRequest
0 голосов
/ 06 января 2019

Я написал следующий код для базового варианта использования, если у вас будут похожие обратные вызовы, и вы хотите знать, когда они все сработали.

Оборачивает обратные вызовы и отслеживает их прогресс:

//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? (Извините, если это дубликат, я не смог его найти)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...