KotlinのIterable.unzipはPairのリストにしか対応していない

May 26, 2019

タイトルの通り、 kotlin.collectionsのunzip はPairのリスト(厳密に言うと ArrayIterable )にしか対応していなかった。

なので、 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して聞いてみる。