package moe.kageru.sekwences class PeekableSequence(source: Sequence) : Sequence { private val iterator: PeekableIterator = PeekableIterator(source.iterator()) override fun iterator(): Iterator = iterator fun peek(): T? = iterator.peek() } internal class PeekableIterator(private val source: Iterator) : Iterator { private var peeked: T? = null override fun hasNext(): Boolean { return source.hasNext() || peeked != null } override fun next(): T { return if (peeked == null) { source.next() } else { val ret = peeked peeked = null ret!! } } fun peek(): T? { return when { peeked != null -> peeked hasNext() -> { peeked = next() peeked!! } else -> null } } }