fun List.chunks(n: Int): List> = chunks(n) { it.toList() } inline fun List.chunks(n: Int, transform: (List) -> R): List { require(n >= 1) return buildList { var offset = 0 var remaining = this@chunks.size for (i in n - 1 downTo 0) { val size = (remaining + i) / (i + 1) add(transform(this@chunks.subList(offset, offset + size))) offset += size remaining -= size } } }