package com.suno.android.common_mvi import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach class FlowBinder( private val scope: CoroutineScope, private val dispatch: (Event) -> Unit, private val logError: (Throwable) -> Unit, ) { fun bind( source: Flow, map: (T) -> Event, onErrorEvent: ((Throwable) -> Event)? = null, ): Job = source .map(map) .catch { e -> if (onErrorEvent != null) emit(onErrorEvent(e)) else logError(e) } .onEach(dispatch) .launchIn(scope) }