package me.amitshekhar.learn.kotlin.flow.ui.task.twotasks import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import me.amitshekhar.learn.kotlin.flow.data.api.ApiHelper import me.amitshekhar.learn.kotlin.flow.data.local.DatabaseHelper import me.amitshekhar.learn.kotlin.flow.utils.DispatcherProvider import me.amitshekhar.learn.kotlin.flow.ui.base.UiState class TwoLongRunningTasksViewModel( private val apiHelper: ApiHelper, private val dbHelper: DatabaseHelper, val dispatcherProvider: DispatcherProvider ) : ViewModel() { private val _uiState = MutableStateFlow>(UiState.Loading) val uiState: StateFlow> = _uiState fun startLongRunningTask() { viewModelScope.launch(dispatcherProvider.main) { _uiState.value = UiState.Loading doLongRunningTaskOne() .zip(doLongRunningTaskTwo()) { resultOne, resultTwo -> return@zip resultOne + resultTwo } .flowOn(dispatcherProvider.default) .catch { e -> _uiState.value = UiState.Error(e.toString()) } .collect { _uiState.value = UiState.Success(it) } } } private fun doLongRunningTaskTwo(): Flow { return flow { // your code for doing a long running task // Added delay to simulate delay(5000) emit("Two") } } private fun doLongRunningTaskOne(): Flow { return flow { // your code for doing a long running task // Added delay to simulate delay(5000) emit("One") } } }