open class IIterator { fun next() : T val hasNext : Boolean fun toArray(buffer : MutableArray) : Int { // T is still an in-parameter return fillBuffer(buffer, 0, buffer.size) } fun toArray(buffer : MutableArray, from : Int, length : Int) : Int { // T is still an in-parameter if (from < 0 || from > buffer.lastIndex || length < 0 || length > buffer.size - from) { throw IndexOutOfBoundsException(); } if (len == 0) return 0 var count = 0; for (i in from .. from + length - 1) { if (!hasNext) return count buffer[i] = next() count++ } return count } }