diff --git a/src/main/kotlin/moe/kageru/sekwences/Sekwences.kt b/src/main/kotlin/moe/kageru/sekwences/Sekwences.kt index 0e675fc..eb0a019 100644 --- a/src/main/kotlin/moe/kageru/sekwences/Sekwences.kt +++ b/src/main/kotlin/moe/kageru/sekwences/Sekwences.kt @@ -4,6 +4,11 @@ package moe.kageru.sekwences * Returns a sequences that optionally merges adjacent elements. * Heavily inspired by Itertools.coalesce() from the Rust crate. * + * The merge function will be passed two adjacent elements in the sequence. + * If the two can be merged, the result of the merging process should be returned. + * If null is returned, the first of the two elements is returned, + * and the second will be used as the first element in the next merge operation. + * * https://docs.rs/itertools/0.8.0/itertools/trait.Itertools.html#method.coalesce */ fun Sequence.coalesce(merger: (T, T) -> T?): Sequence { @@ -14,14 +19,21 @@ fun Sequence.coalesce(merger: (T, T) -> T?): Sequence { } } -class CoalescingSequence(private val source: Sequence, private inline val merger: (T, T) -> T?) : Sequence { +/** + * Sequence that holds a [CoalescingIterator]. + */ +internal class CoalescingSequence(private val source: Sequence, private inline val merger: (T, T) -> T?) : Sequence { override fun iterator(): Iterator { return CoalescingIterator(source.iterator(), merger) } } -class CoalescingIterator(private val source: Iterator, private inline val merger: (T, T) -> T?) : Iterator { +/** + * Iterator that will attempt to merge adjacent elements as described in the KDoc for [coalesce]. + */ +internal class CoalescingIterator(private val source: Iterator, private inline val merger: (T, T) -> T?) : Iterator { 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 diff --git a/src/test/kotlin/moe/kageru/sekwences/SekwencesTest.kt b/src/test/kotlin/moe/kageru/sekwences/SekwencesTest.kt index a5440e1..07b9404 100644 --- a/src/test/kotlin/moe/kageru/sekwences/SekwencesTest.kt +++ b/src/test/kotlin/moe/kageru/sekwences/SekwencesTest.kt @@ -45,4 +45,4 @@ class SekwencesTest : ShouldSpec({ }.toList() output shouldBe input } -}) \ No newline at end of file +})