From 8bc84b404d9f9056bd6e5963344f8df5b107fca8 Mon Sep 17 00:00:00 2001 From: tarsin Date: Tue, 18 Jul 2023 18:23:40 +0800 Subject: [PATCH] Reimplement groupByToObserved --- .../com/hippo/ehviewer/ui/settings/FilterScreen.kt | 12 ++---------- .../moe/tarsin/coroutines/ObservedCollections.kt | 13 +++++++++++++ 2 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/moe/tarsin/coroutines/ObservedCollections.kt diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/FilterScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/FilterScreen.kt index f26225291..166cb50e9 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/settings/FilterScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/FilterScreen.kt @@ -30,10 +30,8 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.currentRecomposeScope -import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll @@ -53,6 +51,7 @@ import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder import com.hippo.ehviewer.ui.tools.Deferred import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async +import moe.tarsin.coroutines.groupByToObserved @Composable fun FilterScreen() { @@ -60,14 +59,7 @@ fun FilterScreen() { val context = LocalContext.current val scope = rememberCoroutineScope { Dispatchers.IO } val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() - val allFilterMap = remember { - scope.async { - LinkedHashMap>().also { dest -> - FilterMode.entries.forEach { dest[it] = mutableStateListOf() } - EhFilter.filters.await().forEach { requireNotNull(dest[it.mode]).add(it) } - } - } - } + val allFilterMap = remember { scope.async { EhFilter.filters.await().groupByToObserved { it.mode } } } class AddFilterDialogHelper(private val dialog: AlertDialog) : View.OnClickListener { private val mArray = dialog.context.resources.getStringArray(R.array.filter_entries) private val binding = DialogAddFilterBinding.bind(dialog.findViewById(R.id.base)!!) diff --git a/app/src/main/java/moe/tarsin/coroutines/ObservedCollections.kt b/app/src/main/java/moe/tarsin/coroutines/ObservedCollections.kt new file mode 100644 index 000000000..1cdf9501d --- /dev/null +++ b/app/src/main/java/moe/tarsin/coroutines/ObservedCollections.kt @@ -0,0 +1,13 @@ +package moe.tarsin.coroutines + +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.snapshots.SnapshotStateList + +inline fun > Iterable.groupByToObserved(keySelector: (T) -> K): MutableMap> { + val destination = enumValues().associateWith { mutableStateListOf() } + for (element in this) { + val key = keySelector(element) + requireNotNull(destination[key]).add(element) + } + return destination as MutableMap> +}