var result = 0 fun Iterator.foreach(action: (T) -> Unit) { while (this.hasNext()) { (action)(this.next()) } } fun Iterator.select(f: (In) -> Out) : Iterator { return Selector(this, f); } class Selector(val source: Iterator, val f: (In) -> Out) : Iterator { override fun hasNext(): Boolean = source.hasNext() override fun next(): Out { return (f)(source.next()) } } fun box(): String { Array(4, { it + 1 }).iterator() .select({i -> i * 10}) .foreach({k -> result += k}) if (result != 10+20+30+40) return "Fail: $result" return "OK" }