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 { return if (this.iterator().hasNext()) { CoalescingSequence(this, merger) } else { emptySequence() } } /** * Modifies the current [Sequence] by adding a peek() method * that returns the next element or null without advancing the sequence. * Calling peek() multiple times without next() will return the same value. */ fun Sequence.peekable(): PeekableSequence { return PeekableSequence(this) }