Files
kotlin-fork/compiler/testData/codegen/box/functions/kt1038.kt
T
2020-05-28 22:18:20 +03:00

65 lines
1.9 KiB
Kotlin
Vendored

//KT-1038 Cannot compile lazy iterators
class YieldingIterator<T>(val yieldingFunction : ()->T?) : Iterator<T>
{
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<T>(val yielderFactory : ()->(()->T?)) : Iterable<T>
{
override fun iterator(): Iterator<T> = YieldingIterator(yielderFactory())
}
public fun<TItem> Iterable<TItem>.lazy() : Iterable<TItem>
{
return YieldingIterable {
val iterator = this.iterator();
{ if (iterator.hasNext()) iterator.next() else null }
}
}
infix fun<TItem> Iterable<TItem>.where(predicate : (TItem)->Boolean) : Iterable<TItem>
{
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<TItem, TResult> Iterable<TItem>.select(selector : (TItem)->TResult) : Iterable<TResult>
{
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"
}