Skip to content

Instantly share code, notes, and snippets.

@vlas-ilya
Created October 25, 2024 06:28
Show Gist options
  • Save vlas-ilya/110db54facaf3993a996a5756e114bdc to your computer and use it in GitHub Desktop.
Save vlas-ilya/110db54facaf3993a996a5756e114bdc to your computer and use it in GitHub Desktop.
Задача на собеседование по flow/coroutines

В проекте есть интерфейс Paginator Джун реализовал его и заиспользовал в своей ViewMode, но проблема в том, что при запуске функции main ничего не проиходит. Помоги ему понять в чем проблема

package com.example.test  
  
import kotlinx.coroutines.CoroutineScope  
import kotlinx.coroutines.delay  
import kotlinx.coroutines.flow.Flow  
import kotlinx.coroutines.flow.MutableSharedFlow  
import kotlinx.coroutines.flow.asSharedFlow  
import kotlinx.coroutines.launch  
import kotlinx.coroutines.runBlocking  
  
/// Core  
  
interface Paginator<T> {  
    fun page(): Flow<List<T>>  
    suspend fun nextPage()  
}  
  
/// Junior code  
  
interface DataPaginator: Paginator<String>  
  
class DataPaginatorImpl : DataPaginator {  
    private val flow = MutableSharedFlow<List<String>>()  
  
    override fun page(): Flow<List<String>> = flow.asSharedFlow()  
  
    override suspend fun nextPage() {
        // some long IO operation
        delay(1000)  
        flow.emit(listOf("data"))  
    }  
}  
  
class ViewModel(  
    private val dataPaginator: DataPaginator,  
    private val coroutineScope: CoroutineScope,  
) {  
    fun onResume() {  
        coroutineScope.launch { init() }  
    }  
  
    private suspend fun init() {  
        dataPaginator.page().collect(::renderUI)  
        dataPaginator.nextPage()  
    }  
  
    private fun renderUI(data: List<String>) = data.forEach(::println)  
}  
  
/// Test
fun main() = runBlocking {  
    val viewModel = ViewModel(DataPaginatorImpl(), this)  
    viewModel.onResume()  
}

Усложнение

Сломается ли твое решение в Unit тестах, а если сломается, то как будешь исправлять?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment