//KT-1038 Cannot compile lazy iterators class YieldingIterator(val yieldingFunction : ()->T?) : Iterator { var current : T? = yieldingFunction() override fun next(): T { val next = current; if (next != null) { current = yieldingFunction() return next } else throw IndexOutOfBoundsException() } override fun hasNext(): Boolean = current != null } class YieldingIterable(val yielderFactory : ()->(()->T?)) : Iterable { override fun iterator(): Iterator = YieldingIterator(yielderFactory()) } public fun Iterable.lazy() : Iterable { return YieldingIterable { val iterator = this.iterator(); { if (iterator.hasNext()) iterator.next() else null } } } infix fun Iterable.where(predicate : (TItem)->Boolean) : Iterable { return YieldingIterable { val iterator = this.iterator() fun yielder() : TItem? { while(iterator.hasNext()) { val next = iterator.next() if (predicate(next)) return next } return null } { yielder() } } } infix fun Iterable.select(selector : (TItem)->TResult) : Iterable { return YieldingIterable { val iterator = this.iterator(); { if(iterator.hasNext()) selector(iterator.next()) else null } } } fun box() : String { val x = 0..100 val filtered = x where { it % 2 == 0 } val xx = x select { it * 2 } var res = 0 for (x in xx) res += x return if (res == 10100) "OK" else "fail" }