From 94946e18b8cb1a8a88a6999178a9ccc0ebac65a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petrus=20Nguy=E1=BB=85n=20Th=C3=A1i=20H=E1=BB=8Dc?= Date: Sat, 21 May 2022 17:50:35 +0700 Subject: [PATCH 1/2] deps: flowExt 0.4.0-SNAPSHOT --- .idea/compiler.xml | 2 ++ buildSrc/src/main/kotlin/deps.kt | 2 +- core-ui/build.gradle.kts | 1 + .../java/com/hoc/flowmvi/core_ui/FlowBinding.kt | 17 ++++++++--------- .../main/java/com/hoc/flowmvi/ui/add/AddVM.kt | 4 ++-- .../main/java/com/hoc/flowmvi/ui/main/MainVM.kt | 9 +++------ .../java/com/hoc/flowmvi/ui/search/SearchVM.kt | 4 ++-- 7 files changed, 19 insertions(+), 20 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index bc84b827..44afafaf 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -4,6 +4,8 @@ + + diff --git a/buildSrc/src/main/kotlin/deps.kt b/buildSrc/src/main/kotlin/deps.kt index bf0b7886..3d479258 100644 --- a/buildSrc/src/main/kotlin/deps.kt +++ b/buildSrc/src/main/kotlin/deps.kt @@ -70,7 +70,7 @@ object deps { const val coil = "io.coil-kt:coil:2.0.0-rc03" const val viewBindingDelegate = "com.github.hoc081098:ViewBindingDelegate:1.3.1" - const val flowExt = "io.github.hoc081098:FlowExt:0.3.0" + const val flowExt = "io.github.hoc081098:FlowExt:0.4.0-SNAPSHOT" const val timber = "com.jakewharton.timber:timber:5.0.1" object arrow { diff --git a/core-ui/build.gradle.kts b/core-ui/build.gradle.kts index c98b76d2..8d37a5fb 100644 --- a/core-ui/build.gradle.kts +++ b/core-ui/build.gradle.kts @@ -50,6 +50,7 @@ dependencies { implementation(deps.lifecycle.runtimeKtx) implementation(deps.timber) + implementation(deps.flowExt) addUnitTest() } diff --git a/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt b/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt index 83d357ae..0788d4e1 100644 --- a/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt +++ b/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt @@ -7,11 +7,12 @@ import androidx.annotation.CheckResult import androidx.appcompat.widget.SearchView import androidx.core.widget.doOnTextChanged import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import com.hoc081098.flowext.startWith import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.startWith import kotlinx.coroutines.flow.take import timber.log.Timber import kotlin.coroutines.EmptyCoroutineContext @@ -93,13 +94,11 @@ fun SearchView.queryTextEvents(): Flow { }) awaitClose { setOnQueryTextListener(null) } - }.onStart { - emit( - SearchViewQueryTextEvent( - view = this@queryTextEvents, - query = query, - isSubmitted = false, - ) + }.startWith { + SearchViewQueryTextEvent( + view = this@queryTextEvents, + query = query, + isSubmitted = false, ) } } @@ -111,5 +110,5 @@ fun EditText.textChanges(): Flow { val listener = doOnTextChanged { text, _, _, _ -> trySend(text) } awaitClose { removeTextChangedListener(listener) } - }.onStart { emit(text) } + }.startWith { text } } diff --git a/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddVM.kt b/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddVM.kt index 9a052d80..500695d8 100644 --- a/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddVM.kt +++ b/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddVM.kt @@ -7,6 +7,7 @@ import com.hoc.flowmvi.domain.model.User import com.hoc.flowmvi.domain.usecase.AddUserUseCase import com.hoc.flowmvi.mvi_base.AbstractMviViewModel import com.hoc081098.flowext.flatMapFirst +import com.hoc081098.flowext.flowFromSuspend import com.hoc081098.flowext.mapTo import com.hoc081098.flowext.startWith import com.hoc081098.flowext.withLatestFrom @@ -19,7 +20,6 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterIsInstance -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.merge @@ -110,7 +110,7 @@ class AddVM( .withLatestFrom(userFormFlow) { _, userForm -> userForm } .mapNotNull { it?.orNull() } .flatMapFirst { user -> - flow { emit(addUser(user)) } + flowFromSuspend { addUser(user) } .map { result -> result.fold( ifLeft = { PartialStateChange.AddUser.AddUserFailure(user, it) }, diff --git a/feature-main/src/main/java/com/hoc/flowmvi/ui/main/MainVM.kt b/feature-main/src/main/java/com/hoc/flowmvi/ui/main/MainVM.kt index 46812f24..2a89972a 100644 --- a/feature-main/src/main/java/com/hoc/flowmvi/ui/main/MainVM.kt +++ b/feature-main/src/main/java/com/hoc/flowmvi/ui/main/MainVM.kt @@ -6,7 +6,9 @@ import com.hoc.flowmvi.domain.usecase.GetUsersUseCase import com.hoc.flowmvi.domain.usecase.RefreshGetUsersUseCase import com.hoc.flowmvi.domain.usecase.RemoveUserUseCase import com.hoc.flowmvi.mvi_base.AbstractMviViewModel +import com.hoc081098.flowext.defer import com.hoc081098.flowext.flatMapFirst +import com.hoc081098.flowext.flowFromSuspend import com.hoc081098.flowext.startWith import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview @@ -15,13 +17,11 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.flatMapConcat import kotlinx.coroutines.flow.flatMapMerge -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach @@ -121,11 +121,10 @@ class MainVM( .log("Intent") .map { it.user } .flatMapMerge { userItem -> - flow { + flowFromSuspend { userItem .toDomain() .flatMap { removeUser(it) } - .let { emit(it) } } .map { result -> result.fold( @@ -137,5 +136,3 @@ class MainVM( ) } } - -private fun defer(flowFactory: () -> Flow): Flow = flow { emitAll(flowFactory()) } diff --git a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchVM.kt b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchVM.kt index 86af3af4..df9b2526 100644 --- a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchVM.kt +++ b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchVM.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import com.hoc.flowmvi.domain.usecase.SearchUsersUseCase import com.hoc.flowmvi.mvi_base.AbstractMviViewModel import com.hoc081098.flowext.flatMapFirst +import com.hoc081098.flowext.flowFromSuspend import com.hoc081098.flowext.startWith import com.hoc081098.flowext.takeUntil import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -20,7 +21,6 @@ import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach @@ -55,7 +55,7 @@ class SearchVM( private fun SharedFlow.toPartialStateChangesFlow(): Flow { val executeSearch: suspend (String) -> Flow = { query: String -> - flow { emit(searchUsersUseCase(query)) } + flowFromSuspend { searchUsersUseCase(query) } .map { result -> result.fold( ifLeft = { PartialStateChange.Failure(it, query) }, From 76c32ba9ed9d913c4423d27f9162400808c0d802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petrus=20Nguy=E1=BB=85n=20Th=C3=A1i=20H=E1=BB=8Dc?= Date: Sat, 21 May 2022 17:56:05 +0700 Subject: [PATCH 2/2] Update FlowBinding.kt --- core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt b/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt index 0788d4e1..9e2e5e61 100644 --- a/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt +++ b/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.flow.startWith import kotlinx.coroutines.flow.take import timber.log.Timber import kotlin.coroutines.EmptyCoroutineContext