タイトルの通り、 kotlin.collectionsのunzip
はPairのリスト(厳密に言うと Array
と Iterable
)にしか対応していなかった。
なので、 Triple
用のを定義した。 まぁ Iterable<Pair>#unzip
の定義をほとんど流用しているので、特に面白いことはない。
fun <A, B, C> Iterable<Triple<A, B, C>>.unzip(): Triple<List<A>, List<B>, List<C>> {
val listA = ArrayList<A>()
val listB = ArrayList<B>()
val listC = ArrayList<C>()
for (triple in this) {
listA.add(triple.first)
listB.add(triple.second)
listC.add(triple.third)
}
return Triple(listA, listB, listC)
}
Iterable<Iterable<T>>#unzip
も作れると思うけど、内側のIterableの要素数足りないときにどうするのか決めないといけなくて、今は必要としていなかったので、特に考えてない。
それにしても、なぜ Iterable<Pair>#unzip
があって
Iterable<Triple>#unzip
が用意されていないのだろう?
libraries/stdlib/src/kotlin/collections/Iterables.kt
をGit blameして、リファクタリング前のコミットを追ってみると、
Iterable<Pair<T, R>>.unzip
が最初に実装されたのは このコミット
だった。
もとのissueはKT-5793。 最初からTripleのことは考えられていなかったようだ。
このコミット
でPairとTripleは同時に入ったようなので、KT-5793の対応するときに単に
Triple
のことが忘れ去られていたか、その時必要ではなかったので後回しにされているか、だと思う。
Next Action
KotlinのSlackにjoinして聞いてみる。