38 lines
904 B
Kotlin
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
|
|
}
|
|
}
|
|
}
|