Skip to content

Commit 971fb74

Browse files
committed
feat: enhanced filterIsInstance
1 parent c4bb698 commit 971fb74

2 files changed

Lines changed: 39 additions & 0 deletions

File tree

buildSrc/src/main/kotlin/fastutil-ext-generator.gradle.kts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ val generateAllTask = tasks.register("generate-all") {
2121
enumSetTask,
2222
enumMapTask,
2323
forEachIsInstanceTask,
24+
filterIsInstanceToTask,
2425
functionInvokeTask,
2526
predicateInvokeTask,
2627
consumerInvokeTask,
@@ -797,6 +798,24 @@ val forEachIsInstanceTask = tasks.register<GenerateSrcTask>("forEachIsInstance")
797798
}
798799
}
799800

801+
val filterIsInstanceToTask = tasks.register<GenerateSrcTask>("filterIsInstanceTo-enhanced") {
802+
group = TASK_GROUP
803+
804+
packageName.set(PACKAGE)
805+
imports.add("java.util.stream.Stream")
806+
807+
content {
808+
for (receiver in arrayOf("Array<*>", "Iterable<*>", "Iterator<*>", "Sequence<*>", "Stream<*>")) {
809+
appendLine("inline fun <reified R, C : MutableCollection<in R>> $receiver.filterIsInstanceTo(destination: C, predicate: (R) -> Boolean): C {")
810+
appendLine(" for (element in this) {")
811+
appendLine(" if (element is R && predicate(element)) destination.add(element)")
812+
appendLine(" }")
813+
appendLine(" return destination")
814+
appendLine("}")
815+
}
816+
}
817+
}
818+
800819
val functionInvokeTask = tasks.register<GenerateSrcTask>("function-invoke") {
801820
group = TASK_GROUP
802821

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
@file:Suppress("unused", "NOTHING_TO_INLINE")
2+
@file:JvmName("filterIsInstance-enhanced")
3+
package net.ccbluex.fastutil
4+
5+
import java.util.function.Predicate
6+
import java.util.stream.Stream
7+
8+
inline fun <reified R> Array<*>.filterIsInstance(predicate: (R) -> Boolean): List<R> =
9+
filterIsInstanceTo(ArrayList(), predicate)
10+
11+
inline fun <reified R> Iterable<*>.filterIsInstance(predicate: (R) -> Boolean): List<R> =
12+
filterIsInstanceTo(ArrayList(), predicate)
13+
14+
@Suppress("UNCHECKED_CAST")
15+
inline fun <reified R> Sequence<*>.filterIsInstance(crossinline predicate: (R) -> Boolean): Sequence<R> =
16+
filter { it is R && predicate(it) } as Sequence<R>
17+
18+
@Suppress("UNCHECKED_CAST")
19+
inline fun <reified R> Stream<*>.filterIsInstance(crossinline predicate: (R) -> Boolean): Stream<R> =
20+
filter(Predicate { it is R && predicate(it) }) as Stream<R>

0 commit comments

Comments
 (0)