I realized having to host this potentially indefinitely might not be the best idea, so I am going to shut down this gitea instance eventually.
You’ll have time, at least until the end of 2022, probably longer, but please just get all your stuff somewhere safe in case we ever disappear.
If any of your build scripts rely on my (kageru’s) projects hosted here, check my Github or IEW on Github for encoding projects. If you can’t find what you’re looking there, tell me to migrate it.
Extensions for Kotlin sequences
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

41 lines
1.5 KiB

package moe.kageru.sekwences
* Sequence that holds a [CoalescingIterator].
internal class CoalescingSequence<T>(private val source: Sequence<T>, private inline val merger: (T, T) -> T?) : Sequence<T> {
override fun iterator(): Iterator<T> {
return CoalescingIterator(source.iterator(), merger)
* Iterator that will attempt to merge adjacent elements as described in the KDoc for [coalesce].
internal class CoalescingIterator<T>(private val source: Iterator<T>, private inline val merger: (T, T) -> T?) : Iterator<T> {
private var previous: T = if (source.hasNext()) source.next() else error("Please don’t pass empty iterators in here")
// The reason we need this marker is that our iterator can still hold one value, even if the source has been drained.
private var hasNext = true
override fun hasNext() = hasNext
override tailrec fun next(): T {
if (!source.hasNext()) {
hasNext = false
return previous
val current = source.next()
val merged = merger(previous, current)
// If the elements can’t be merged, return the first, then save the second for next time.
return if (merged == null) {
val ret = previous
previous = current
} else {
previous = merged