interface IIterator<T> {
fun hasNext(): Boolean
fun next(): T
}
class ReverseIterator<T>(private val collection: List<T>) : IIterator<T> {
private var currentIndex: Int = collection.size - 1
override fun hasNext(): Boolean = currentIndex >= 0
override fun next(): T {
val item = collection[currentIndex--]
return item
}
}
object ListUtil {
fun <T>List<T>.reverseIterator(): ReverseIterator<T> = ReverseIterator(this)
}
fun main() {
val digits = listOf(1, 3, 5, 9, 7, 3)
val iterator = digits.reverseIterator()
while (iterator.hasNext()) {
println(iterator.next())
}
// default iterator
for (digit in digits) {
println(digit)
}
}