asavio
12/28/2021, 8:59 AMSequence
or one with a really a large count of objects lazily without it being too time consuming like the factory methods?Ruckus
12/28/2021, 9:02 AMasavio
12/28/2021, 9:06 AMephemient
12/28/2021, 9:14 AMn
- then you have some optionsasavio
12/28/2021, 10:57 AM// list.size == 5
list.map {
`yield objects in ascending order`()
}.asSequence().flatten()
Is there a solution for this?ephemient
12/28/2021, 12:11 PMasavio
12/28/2021, 12:14 PMephemient
12/28/2021, 12:41 PMfun <T : Comparable<T>> Iterable<Sequence<T>>.mergeSorted(): Sequence<T> = mergeSorted(comparator = naturalOrder())
fun <T> Iterable<Sequence<T>>.mergeSorted(comparator: Comparator<T>): Sequence<T> = sequence {
val queue = PriorityQueue<Pair<Iterator<T>, T>>(compareBy(comparator) { it.second })
mapNotNullTo(queue) { it.iterator().takeIf { it.hasNext() }?.let { it to it.next() } }
while (queue.isNotEmpty()) {
val (iterator, value) = queue.remove()
yield(value)
if (iterator.hasNext()) queue.add(iterator to iterator.next())
}
}
fun main() {
listOf(
generateSequence(1) { 2 * it },
generateSequence(1) { 3 * it },
generateSequence(1) { 5 * it },
).mergeSorted().take(20).forEach { println(it) }
}
asavio
12/28/2021, 1:02 PM