Sekwences/src/main/kotlin/moe/kageru/sekwences/PeekableSequence.kt
2019-10-09 12:01:53 +02:00

38 lines
904 B
Kotlin

package moe.kageru.sekwences
class PeekableSequence<T>(source: Sequence<T>) : Sequence<T> {
private val iterator: PeekableIterator<T> = PeekableIterator(source.iterator())
override fun iterator(): Iterator<T> = iterator
fun peek(): T? = iterator.peek()
}
internal class PeekableIterator<T>(private val source: Iterator<T>) : Iterator<T> {
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
}
}
}