diff --git a/gradle.properties b/gradle.properties index 9d8f0ee..51e3b6d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ kotlin.code.style=official specifyKotlinAsDependency=false projectGroup=ru.dbotthepony.kommons -projectVersion=1.7.4 +projectVersion=1.7.5 guavaDepVersion=33.0.0 gsonDepVersion=2.8.9 diff --git a/src/main/kotlin/ru/dbotthepony/kommons/collect/CollectionUtils.kt b/src/main/kotlin/ru/dbotthepony/kommons/collect/CollectionUtils.kt index 649ce25..fda0424 100644 --- a/src/main/kotlin/ru/dbotthepony/kommons/collect/CollectionUtils.kt +++ b/src/main/kotlin/ru/dbotthepony/kommons/collect/CollectionUtils.kt @@ -1,7 +1,9 @@ package ru.dbotthepony.kommons.collect +import ru.dbotthepony.kommons.core.KOptional import java.lang.ref.Reference import java.util.* +import java.util.concurrent.CompletableFuture import java.util.stream.Stream import java.util.stream.StreamSupport @@ -17,8 +19,8 @@ inline fun Stream<*>.filterIsInstance(): Stream { return filter { it is T } as Stream } -inline fun MutableList>.forValidRefs(fn: (T) -> Unit) { - val iterator = listIterator() +inline fun MutableIterable>.forValidRefs(fn: (T) -> Unit) { + val iterator = iterator() for (value in iterator) { val get = value.get() @@ -31,8 +33,8 @@ inline fun MutableList>.forValidRefs(fn: (T) -> Unit) { } } -inline fun MutableList>.forValidRefsBreak(fn: (T) -> Boolean) { - val iterator = listIterator() +inline fun MutableIterable>.forValidRefsBreak(fn: (T) -> Boolean) { + val iterator = iterator() for (value in iterator) { val get = value.get() @@ -47,6 +49,21 @@ inline fun MutableList>.forValidRefsBreak(fn: (T) -> Bo } } +fun chainOptionalFutures(source: Iterable, mapper: (S) -> CompletableFuture>): CompletableFuture> { + val itr = source.iterator() + + if (itr.hasNext()) { + var future = mapper.invoke(itr.next()) + + for (v in itr) + future = future.thenCompose { if (it.isPresent) CompletableFuture.completedFuture(it) else mapper.invoke(v) } + + return future + } + + return CompletableFuture.completedFuture(KOptional.empty()) +} + fun Stream.asIterable(): Iterable { return object : Iterable { override fun iterator(): Iterator {