fold()を使って連続した時間をひとつの時間量オブジェクトにまとめる

問題

例えばこう言ったクラスがある場合に、

data class Duration(
    val start: LocalTime,
    val end: LocalTime
) {
    override fun toString(): String {
        return "$start - $end"
    }

    fun isContinuousFrom(from: Duration): Boolean {
        return from.end.plusMinutes(1) == start
    }
}

List<Duration>を作成して時間が隣り合った要素の時間が連続している場合にひとつのDurationオブジェクトとして再定義する、という要件を考える。
つまり、12:00 - 13:00, 13:01 - 14:00というリストの場合は12:00 - 14:00としたい。

解法

    val durations = listOf(
        Duration(
            LocalTime.of(15, 0),
            LocalTime.of(16, 0),
        ),
        Duration(
            LocalTime.of(16, 30),
            LocalTime.of(17, 0),
        ),
        Duration(
            LocalTime.of(17, 1),
            LocalTime.of(17, 20),
        ),
        Duration(
            LocalTime.of(18, 0),
            LocalTime.of(19, 40),
        ),
        Duration(
            LocalTime.of(19, 41),
            LocalTime.of(20, 0),
        ),
    )

    //1つ目の要素を初期値、2つ目以降の要素を連続しているかの判定用とする
    val compare = durations.drop(1)
    val result = compare.fold(durations.take(1)) { acc, duration ->
     
        if (duration.isContinuousFrom(acc.last())) {
            // このブロック内で、連続した時間の場合にオブジェクトを再生成してリストを構築している
            acc.dropLast(1) + Duration(acc.last().start, duration.end)
        } else {
            acc + duration
        }
    }