eveeeeef21

NBR Before Nullable Safety

Sep 4th, 2025
668
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.56 KB | Source Code | 0 0
  1. package com.ahmadrd.movieexplorer.core.data
  2.  
  3. import com.ahmadrd.movieexplorer.core.data.source.remote.network.ApiResponse
  4. import kotlinx.coroutines.flow.*
  5.  
  6. abstract class NetworkBoundResource<ResultType, RequestType> {
  7.  
  8.     private var result: Flow<Resource<ResultType>> = flow {
  9.         emit(Resource.Loading())
  10.         val dbSource = loadFromDB().first()
  11.         if (shouldFetch(dbSource)) {
  12.             emit(Resource.Loading())
  13.             when (val apiResponse = createCall().first()) {
  14.                 is ApiResponse.Success -> {
  15.                     saveCallResult(apiResponse.data)
  16.                     emitAll(loadFromDB().map {
  17.                         Resource.Success(
  18.                             it
  19.                         )
  20.                     })
  21.                 }
  22.                 is ApiResponse.Empty -> {
  23.                     emitAll(loadFromDB().map { Resource.Success(it) })
  24.                 }
  25.                 is ApiResponse.Error -> {
  26.                     onFetchFailed()
  27.                     emit(Resource.Error(apiResponse.errorMessage))
  28.                 }
  29.             }
  30.         } else {
  31.             emitAll(loadFromDB().map { Resource.Success(it) })
  32.         }
  33.     }
  34.  
  35.     protected open fun onFetchFailed() {}
  36.  
  37.     protected abstract fun loadFromDB(): Flow<ResultType>
  38.  
  39.     protected abstract fun shouldFetch(data: ResultType?): Boolean
  40.  
  41.     protected abstract suspend fun createCall(): Flow<ApiResponse<RequestType>>
  42.  
  43.     protected abstract suspend fun saveCallResult(data: RequestType)
  44.  
  45.     fun asFlow(): Flow<Resource<ResultType>> = result
  46. }
Advertisement
Add Comment
Please, Sign In to add comment