Вы можете создать функцию zipOf
, которая возвращает Sequence
всех возможных комбинаций. Вот 3 перегрузки этой функции:
fun <T1, T2> zipOf(first: Iterable<T1>, second: Iterable<T2>) = sequence {
for (t1 in first)
for (t2 in second)
yield(t1 to t2)
}
fun <T1, T2, T3> zipOf(first: Iterable<T1>, second: Iterable<T2>, third: Iterable<T3>) = sequence {
for (t1 in first)
for (t2 in second)
for (t3 in third)
yield(Triple(t1, t2, t3))
}
fun <T> zipOf(vararg iterables: Iterable<T>): Sequence<List<T>> =
iterables.fold(sequenceOf(emptyList())) { result, iterable ->
result.flatMap { list -> iterable.asSequence().map { elm -> list + elm } }
}
Вы можете использовать их следующим образом:
for ((x, y) in zipOf(1..100, 50 downTo 0)) {}
for ((x, y, z) in zipOf(1..100, 50 downTo 0, 500..1000 step 2)) {}
for ((x, y, z, w) in zipOf(1..100, 50 downTo 0, 500..1000 step 2, 0..1)) {}