Add streamy iterator docs
This commit is contained in:
parent
9ae099ec23
commit
109de2b414
@ -14,6 +14,11 @@ import java.util.stream.Collector
|
|||||||
|
|
||||||
// Aside parallel work, unimplemented Stream API elements can be easily implemented when required
|
// Aside parallel work, unimplemented Stream API elements can be easily implemented when required
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters elements of [parent] iterator
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [parent] is
|
||||||
|
*/
|
||||||
class FilteredIterator<T>(private val parent: Iterator<T>, private val predicate: Predicate<in T>) : MutableIterator<T> {
|
class FilteredIterator<T>(private val parent: Iterator<T>, private val predicate: Predicate<in T>) : MutableIterator<T> {
|
||||||
private var foundValue: Any? = Companion
|
private var foundValue: Any? = Companion
|
||||||
|
|
||||||
@ -66,13 +71,18 @@ class FilteredIterator<T>(private val parent: Iterator<T>, private val predicate
|
|||||||
private companion object
|
private companion object
|
||||||
}
|
}
|
||||||
|
|
||||||
class MappingIterator<T, R>(private val parent: Iterator<T>, private val transform: (T) -> R) : MutableIterator<R> {
|
/**
|
||||||
|
* Maps elements of [parent] iterator from values of [T] to [R] using function [mapper]
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [parent] is
|
||||||
|
*/
|
||||||
|
class MappingIterator<T, R>(private val parent: Iterator<T>, private val mapper: (T) -> R) : MutableIterator<R> {
|
||||||
override fun hasNext(): Boolean {
|
override fun hasNext(): Boolean {
|
||||||
return parent.hasNext()
|
return parent.hasNext()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun next(): R {
|
override fun next(): R {
|
||||||
return transform.invoke(parent.next())
|
return mapper.invoke(parent.next())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun remove() {
|
override fun remove() {
|
||||||
@ -80,13 +90,18 @@ class MappingIterator<T, R>(private val parent: Iterator<T>, private val transfo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class FlatMappingIterator<T, R>(private val parent: Iterator<T>, private val transform: (T) -> Iterator<R>) : MutableIterator<R> {
|
/**
|
||||||
|
* Maps elements of [parent] iterator from type [T] to other iterators of type [R] using function [mapper]
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [parent] is
|
||||||
|
*/
|
||||||
|
class FlatMappingIterator<T, R>(private val parent: Iterator<T>, private val mapper: (T) -> Iterator<R>) : MutableIterator<R> {
|
||||||
private var current: Iterator<R>? = null
|
private var current: Iterator<R>? = null
|
||||||
private var last: Iterator<R>? = null
|
private var last: Iterator<R>? = null
|
||||||
|
|
||||||
override fun hasNext(): Boolean {
|
override fun hasNext(): Boolean {
|
||||||
while (current?.hasNext() != true && parent.hasNext()) {
|
while (current?.hasNext() != true && parent.hasNext()) {
|
||||||
current = transform.invoke(parent.next())
|
current = mapper.invoke(parent.next())
|
||||||
}
|
}
|
||||||
|
|
||||||
return current?.hasNext() == true
|
return current?.hasNext() == true
|
||||||
@ -107,7 +122,12 @@ class FlatMappingIterator<T, R>(private val parent: Iterator<T>, private val tra
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class LimitingIterator<T>(val parent: Iterator<T>, val limit: Long) : Iterator<T> {
|
/**
|
||||||
|
* Limits amount of values returned by [parent] iterator to return at most [limit] values
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [parent] is
|
||||||
|
*/
|
||||||
|
class LimitingIterator<T>(private val parent: Iterator<T>, private val limit: Long) : Iterator<T> {
|
||||||
init {
|
init {
|
||||||
require(limit > 0) { "Invalid limit $limit" }
|
require(limit > 0) { "Invalid limit $limit" }
|
||||||
}
|
}
|
||||||
@ -126,7 +146,12 @@ class LimitingIterator<T>(val parent: Iterator<T>, val limit: Long) : Iterator<T
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class SkippingIterator<T>(val parent: Iterator<T>, skip: Long) : MutableIterator<T> {
|
/**
|
||||||
|
* Skips (discards) up to [skip] values returned by [parent] iterator
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [parent] is
|
||||||
|
*/
|
||||||
|
class SkippingIterator<T>(private val parent: Iterator<T>, skip: Long) : MutableIterator<T> {
|
||||||
init {
|
init {
|
||||||
require(skip >= 0) { "Invalid skip amount $skip" }
|
require(skip >= 0) { "Invalid skip amount $skip" }
|
||||||
}
|
}
|
||||||
@ -162,10 +187,39 @@ class SkippingIterator<T>(val parent: Iterator<T>, skip: Long) : MutableIterator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters elements of [this] iterator
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [this] is
|
||||||
|
*/
|
||||||
fun <T> Iterator<T>.filter(condition: Predicate<in T>) = FilteredIterator(this, condition)
|
fun <T> Iterator<T>.filter(condition: Predicate<in T>) = FilteredIterator(this, condition)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps elements of [this] iterator from values of [T] to [R] using function [mapper]
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [this] is
|
||||||
|
*/
|
||||||
fun <T, R> Iterator<T>.map(mapper: (T) -> R) = MappingIterator(this, mapper)
|
fun <T, R> Iterator<T>.map(mapper: (T) -> R) = MappingIterator(this, mapper)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps elements of [this] iterator from values of [T] to [R] using function [mapper]
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [this] is
|
||||||
|
*/
|
||||||
fun <T, R> Iterator<T>.map(mapper: java.util.function.Function<T, R>) = MappingIterator(this, mapper::apply)
|
fun <T, R> Iterator<T>.map(mapper: java.util.function.Function<T, R>) = MappingIterator(this, mapper::apply)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps elements of [this] iterator from type [T] to other iterators of type [R] using function [mapper]
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [this] is
|
||||||
|
*/
|
||||||
fun <T, R> Iterator<T>.flatMap(mapper: (T) -> Iterator<R>) = FlatMappingIterator(this, mapper)
|
fun <T, R> Iterator<T>.flatMap(mapper: (T) -> Iterator<R>) = FlatMappingIterator(this, mapper)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps elements of [this] iterator from type [T] to other iterators of type [R] using function [mapper]
|
||||||
|
*
|
||||||
|
* Resulting [Iterator] is [MutableIterator] if [this] is
|
||||||
|
*/
|
||||||
fun <T, R> Iterator<T>.flatMap(mapper: java.util.function.Function<T, Iterator<R>>) = FlatMappingIterator(this, mapper::apply)
|
fun <T, R> Iterator<T>.flatMap(mapper: java.util.function.Function<T, Iterator<R>>) = FlatMappingIterator(this, mapper::apply)
|
||||||
|
|
||||||
fun interface O2DFunction<T> {
|
fun interface O2DFunction<T> {
|
||||||
|
Loading…
Reference in New Issue
Block a user