fun Iterable.blockBy(transform: (T) -> R): List> { val iter = iterator() if (!iter.hasNext()) return emptyList() val start = iter.next() var key = transform(start) var count = mutableListOf(start) val ret = mutableListOf>() for (i in iter) { val ikey = transform(i) if (key == ikey) count.add(i) else { ret.add(count) key = ikey count = mutableListOf(i) } } return ret }