• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }