From fe5137dc2b3da202380e4fb141acf93074670efb Mon Sep 17 00:00:00 2001 From: DatLag Date: Wed, 29 Nov 2023 15:05:34 +0100 Subject: [PATCH] fix and fasten search --- .../shared/ui/custom/ExpandableText.kt | 8 +++--- .../favorite/FavoriteScreenComponent.kt | 27 +++++++++++------- .../initial/search/SearchScreenComponent.kt | 28 ++++++++++++------- .../model/common/ExtendCollection.kt | 2 +- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/custom/ExpandableText.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/custom/ExpandableText.kt index d1a1c7b5..8ca38b60 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/custom/ExpandableText.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/custom/ExpandableText.kt @@ -2,8 +2,8 @@ package dev.datlag.burningseries.shared.ui.custom import androidx.compose.foundation.text.InlineTextContent import androidx.compose.foundation.text.appendInlineContent -import androidx.compose.material.LocalTextStyle -import androidx.compose.material.Text +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.Text import androidx.compose.material3.LocalContentColor import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -70,7 +70,7 @@ fun ExpandableText( modifier: Modifier = Modifier, expandedMaxLines: Int = Int.MAX_VALUE, toggle: @Composable (() -> Unit)? = null, - color: Color = LocalContentColor.current, + color: Color = Color.Unspecified, fontSize: TextUnit = TextUnit.Unspecified, fontStyle: FontStyle? = null, fontWeight: FontWeight? = null, @@ -128,7 +128,7 @@ fun ExpandableText( modifier: Modifier = Modifier, expandedMaxLines: Int = Int.MAX_VALUE, toggle: @Composable (() -> Unit)? = null, - color: Color = LocalContentColor.current, + color: Color = Color.Unspecified, fontSize: TextUnit = TextUnit.Unspecified, fontStyle: FontStyle? = null, fontWeight: FontWeight? = null, diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/favorite/FavoriteScreenComponent.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/favorite/FavoriteScreenComponent.kt index f85023f5..ae354222 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/favorite/FavoriteScreenComponent.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/favorite/FavoriteScreenComponent.kt @@ -16,6 +16,9 @@ import dev.datlag.burningseries.model.algorithm.JaroWinkler import dev.datlag.burningseries.model.common.safeSubList import dev.datlag.burningseries.shared.ui.navigation.Component import dev.datlag.burningseries.shared.ui.screen.initial.series.SeriesScreenComponent +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.* import org.kodein.di.DI import org.kodein.di.instance @@ -40,16 +43,20 @@ class FavoriteScreenComponent( if (t2.isBlank()) { emptyList() } else { - t1.map { - when { - it.title.equals(t2, true) -> it to 1.0 - it.title.startsWith(t2, true) -> it to 0.95 - it.title.contains(t2, true) -> it to 0.9 - else -> it to JaroWinkler.distance(it.title, t2) - } - }.filter { - it.second > 0.85 - }.sortedByDescending { it.second }.map { it.first }.safeSubList(0, 10) + coroutineScope { + t1.map { + async { + when { + it.title.trim().equals(t2.trim(), true) -> it to 1.0 + it.title.trim().startsWith(t2.trim(), true) -> it to 0.95 + it.title.trim().contains(t2.trim(), true) -> it to 0.9 + else -> it to JaroWinkler.distance(it.title.trim(), t2.trim()) + } + } + }.awaitAll().filter { + it.second > 0.85 + }.sortedByDescending { it.second }.map { it.first }.safeSubList(0, 10) + } } }.stateIn(ioScope(), SharingStarted.Lazily, emptyList()) diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/search/SearchScreenComponent.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/search/SearchScreenComponent.kt index ad1daaea..e7b9ad27 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/search/SearchScreenComponent.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/search/SearchScreenComponent.kt @@ -17,6 +17,10 @@ import dev.datlag.burningseries.model.state.SearchState import dev.datlag.burningseries.network.state.SearchStateMachine import dev.datlag.burningseries.shared.ui.navigation.Component import dev.datlag.burningseries.shared.ui.screen.initial.series.SeriesScreenComponent +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.flow.* import org.kodein.di.DI import org.kodein.di.instance @@ -50,16 +54,20 @@ class SearchScreenComponent( if (t2.isBlank()) { emptyList() } else { - t1.map { - when { - it.title.equals(t2, true) -> it to 1.0 - it.title.startsWith(t2, true) -> it to 0.95 - it.title.contains(t2, true) -> it to 0.9 - else -> it to JaroWinkler.distance(it.title, t2) - } - }.filter { - it.second > 0.85 - }.sortedByDescending { it.second }.map { it.first }.safeSubList(0, 10) + coroutineScope { + t1.map { + async { + when { + it.title.trim().equals(t2.trim(), true) -> it to 1.0 + it.title.trim().startsWith(t2.trim(), true) -> it to 0.95 + it.title.trim().contains(t2.trim(), true) -> it to 0.9 + else -> it to JaroWinkler.distance(it.title.trim(), t2.trim()) + } + } + }.awaitAll().filter { + it.second > 0.85 + }.sortedByDescending { it.second }.map { it.first }.safeSubList(0, 10) + } } }.stateIn(ioScope(), SharingStarted.Lazily, emptyList()) diff --git a/model/src/commonMain/kotlin/dev/datlag/burningseries/model/common/ExtendCollection.kt b/model/src/commonMain/kotlin/dev/datlag/burningseries/model/common/ExtendCollection.kt index fb0d85ba..7afe1a33 100644 --- a/model/src/commonMain/kotlin/dev/datlag/burningseries/model/common/ExtendCollection.kt +++ b/model/src/commonMain/kotlin/dev/datlag/burningseries/model/common/ExtendCollection.kt @@ -27,7 +27,7 @@ fun List.safeSubList(from: Int, to: Int): List { val safeFrom = max(min(from, lastIndex), 0) return this.subList( safeFrom, - max(safeFrom, min(to, lastIndex)) + max(safeFrom, min(to, size)) ) }