diff --git a/CHANGELOG.md b/CHANGELOG.md index caa403afbaf..89d11bb3aa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.12.15 + +* `Common`: + * `applyDiff` will return `Diff` object since this release + * `Android`: + * New functions/extensions `findViewsByTag` and `findViewsByTagInActivity` +* `Coroutines`: + * Add `Flow` extensions `flatMap`, `flatMapNotNull` and `flatten` + * Add `Flow` extensions `takeNotNull` and `filterNotNull` + ## 0.12.14 * `Versions`: diff --git a/common/src/commonMain/kotlin/dev/inmo/micro_utils/common/DiffUtils.kt b/common/src/commonMain/kotlin/dev/inmo/micro_utils/common/DiffUtils.kt index f885b9f2ba1..596e413fa21 100644 --- a/common/src/commonMain/kotlin/dev/inmo/micro_utils/common/DiffUtils.kt +++ b/common/src/commonMain/kotlin/dev/inmo/micro_utils/common/DiffUtils.kt @@ -173,7 +173,7 @@ inline fun Iterable.calculateStrictDiff( fun MutableList.applyDiff( source: Iterable, strictComparison: Boolean = false -) = calculateDiff(source, strictComparison).let { +): Diff = calculateDiff(source, strictComparison).also { for (i in it.removed.indices.sortedDescending()) { removeAt(it.removed[i].index) } diff --git a/common/src/main/kotlin/dev/inmo/micro_utils/common/FindViewsByTag.kt b/common/src/main/kotlin/dev/inmo/micro_utils/common/FindViewsByTag.kt new file mode 100644 index 00000000000..ddd21752a5a --- /dev/null +++ b/common/src/main/kotlin/dev/inmo/micro_utils/common/FindViewsByTag.kt @@ -0,0 +1,61 @@ +package dev.inmo.micro_utils.common + +import android.app.Activity +import android.view.View +import android.view.ViewGroup +import androidx.core.view.children +import androidx.fragment.app.Fragment + +fun findViewsByTag(viewGroup: ViewGroup, tag: Any?): List { + return viewGroup.children.flatMap { + findViewsByTag(it, tag) + }.toList() +} + +fun findViewsByTag(viewGroup: ViewGroup, key: Int, tag: Any?): List { + return viewGroup.children.flatMap { + findViewsByTag(it, key, tag) + }.toList() +} + +fun findViewsByTag(view: View, tag: Any?): List { + val result = mutableListOf() + if (view.tag == tag) { + result.add(view) + } + if (view is ViewGroup) { + result.addAll(findViewsByTag(view, tag)) + } + return result.toList() +} + +fun findViewsByTag(view: View, key: Int, tag: Any?): List { + val result = mutableListOf() + if (view.getTag(key) == tag) { + result.add(view) + } + if (view is ViewGroup) { + result.addAll(findViewsByTag(view, key, tag)) + } + return result.toList() +} + +fun Activity.findViewsByTag(tag: Any?) = rootView ?.let { + findViewsByTag(it, tag) +} + +fun Activity.findViewsByTag(key: Int, tag: Any?) = rootView ?.let { + findViewsByTag(it, key, tag) +} + +fun Fragment.findViewsByTag(tag: Any?) = view ?.let { + findViewsByTag(it, tag) +} + +fun Fragment.findViewsByTag(key: Int, tag: Any?) = view ?.let { + findViewsByTag(it, key, tag) +} + +fun Fragment.findViewsByTagInActivity(tag: Any?) = activity ?.findViewsByTag(tag) + +fun Fragment.findViewsByTagInActivity(key: Int, tag: Any?) = activity ?.findViewsByTag(key, tag) diff --git a/common/src/main/kotlin/dev/inmo/micro_utils/common/RootView.kt b/common/src/main/kotlin/dev/inmo/micro_utils/common/RootView.kt new file mode 100644 index 00000000000..603f53f5f62 --- /dev/null +++ b/common/src/main/kotlin/dev/inmo/micro_utils/common/RootView.kt @@ -0,0 +1,7 @@ +package dev.inmo.micro_utils.common + +import android.app.Activity +import android.view.View + +val Activity.rootView: View? + get() = findViewById(android.R.id.content) ?.rootView ?: window.decorView.findViewById(android.R.id.content) ?.rootView diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowFlatten.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowFlatten.kt new file mode 100644 index 00000000000..6e5c6d4b729 --- /dev/null +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowFlatten.kt @@ -0,0 +1,39 @@ +package dev.inmo.micro_utils.coroutines + +import kotlinx.coroutines.flow.* +import kotlin.js.JsName +import kotlin.jvm.JvmName + +inline fun Flow>.flatMap( + crossinline mapper: suspend (T) -> R +) = flow { + collect { + it.collect { + emit(mapper(it)) + } + } +} + +@JsName("flatMapIterable") +@JvmName("flatMapIterable") +inline fun Flow>.flatMap( + crossinline mapper: suspend (T) -> R +) = map { + it.asFlow() +}.flatMap(mapper) + +inline fun Flow>.flatMapNotNull( + crossinline mapper: suspend (T) -> R +) = flatMap(mapper).takeNotNull() + +@JsName("flatMapNotNullIterable") +@JvmName("flatMapNotNullIterable") +inline fun Flow>.flatMapNotNull( + crossinline mapper: suspend (T) -> R +) = flatMap(mapper).takeNotNull() + +fun Flow>.flatten() = flatMap { it } + +@JsName("flattenIterable") +@JvmName("flattenIterable") +fun Flow>.flatten() = flatMap { it } diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowNullables.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowNullables.kt new file mode 100644 index 00000000000..e6b665e47f3 --- /dev/null +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowNullables.kt @@ -0,0 +1,6 @@ +package dev.inmo.micro_utils.coroutines + +import kotlinx.coroutines.flow.* + +fun Flow.takeNotNull() = mapNotNull { it } +fun Flow.filterNotNull() = takeNotNull() diff --git a/gradle.properties b/gradle.properties index 5c3e84ae4f3..3732f846fb0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,5 +14,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.12.14 -android_code_version=153 +version=0.12.15 +android_code_version=154