From e45cb714ab03dfe9a1ba57224ddcab16b24f1fba Mon Sep 17 00:00:00 2001 From: James Strachan Date: Sat, 24 Mar 2012 20:29:11 +0000 Subject: [PATCH] added test case for KT-1646 in an attempt to implement lazy filter/flatMap for Iterator --- libraries/stdlib/src/Iterators.kt | 49 +++++++++++++++++++------------ 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/libraries/stdlib/src/Iterators.kt b/libraries/stdlib/src/Iterators.kt index 5dbbba0586d..0ac624a5479 100644 --- a/libraries/stdlib/src/Iterators.kt +++ b/libraries/stdlib/src/Iterators.kt @@ -1,4 +1,4 @@ -package kotlin.util +package kotlin import kotlin.support.AbstractIterator @@ -9,7 +9,7 @@ import java.util.Iterator inline fun java.util.Iterator.filterIsInstance(klass: Class): Iterator = FilterIsIterator(this, klass) private class FilterIsIterator(val iter: java.util.Iterator, val klass: Class) : AbstractIterator() { - override fun computeNext(): R? { + override protected fun computeNext(): R? { while (iter.hasNext()) { val next = iter.next() if (klass.isInstance(next)) { @@ -21,37 +21,46 @@ private class FilterIsIterator(val iter: java.util.Iterator, val kla } } + +// TODO when we're past the compiler error +// http://youtrack.jetbrains.com/issue/KT-1646 +// +// we can use this code to replace the other +// filter / FilterIterator class as it reuses the +// core logic from AbstractIterator + /** Returns a new lazy iterator containing all elements in this iteration which match the given predicate */ -/* -inline fun java.util.Iterator.filter(predicate: (T)-> Boolean) : java.util.Iterator { - return FilterIterator(this, predicate) +inline fun java.util.Iterator.filter2(predicate: (T)-> Boolean) : java.util.Iterator { + return FilterIterator2(this, predicate) } -private class FilterIterator(val iter: java.util.Iterator, val predicate: (T)-> Boolean) : AbstractIterator() { - override fun computeNext(): T? { +private class FilterIterator2(val iter: java.util.Iterator, val fn: (T)-> Boolean) : AbstractIterator() { + override protected fun computeNext(): T? { + /* + + TODO this block generates a compiler error: + http://youtrack.jetbrains.com/issue/KT-1646 + while (iter.hasNext()) { - val next = iter.next() - if (predicate(next)) { - return next + val element = iter.next() + if (fn(element)) { + return element } } + */ done() return null } } -*/ /** Returns a new lazy iterator containing all elements in this iteration which do not match the given predicate */ - /* - inline fun java.util.Iterator.filterNot(predicate: (T)-> Boolean) : java.util.Iterator { - return filter { - !predicate(it) - } +inline fun java.util.Iterator.filterNot(predicate: (T)-> Boolean) : java.util.Iterator { + return filter { + !predicate(it) } - */ +} /** Returns a new lazy iterator containing all the non null elements in this iteration */ -/* inline fun java.util.Iterator?.filterNotNull() : java.util.Iterator = FilterNotNullIterator(this) private class FilterNotNullIterator(val iter: java.util.Iterator?) : AbstractIterator() { @@ -68,7 +77,6 @@ private class FilterNotNullIterator(val iter: java.util.Iterator?) : Abst return null } } -*/ /** @@ -76,6 +84,9 @@ private class FilterNotNullIterator(val iter: java.util.Iterator?) : Abst * are concatenated together into a single collection */ /* + + TODO implement a lazy flatMap + inline fun java.util.Iterator.flatMap(transform: (T)-> java.util.Iterator) : Collection { return flatMapTo<>(ArrayList(), transform) }