1 package com.airbnb.lottie.samples.utils 2 3 import androidx.lifecycle.viewModelScope 4 import com.airbnb.lottie.samples.BuildConfig 5 import com.airbnb.mvrx.* 6 import kotlinx.coroutines.* 7 8 abstract class MvRxViewModel<S : MvRxState>(initialState: S) : BaseMvRxViewModel<S>(initialState, BuildConfig.DEBUG) { 9 /** 10 * This uses [Dispatchers.Main.immediate] by default to mimic [viewModelScope]. 11 */ executenull12 fun <T : Any?> (suspend () -> T).execute( 13 dispatcher: CoroutineDispatcher = Dispatchers.Main.immediate, 14 reducer: S.(Async<T>) -> S 15 ): Job { 16 setState { reducer(Loading()) } 17 return viewModelScope.launch(dispatcher) { 18 try { 19 val result = invoke() 20 setState { reducer(Success(result)) } 21 } catch (e: CancellationException) { 22 throw e 23 } catch (e: Exception) { 24 setState { reducer(Fail(e)) } 25 } 26 } 27 } 28 }