EffectEmitter
One-shot effect delivery with no dependency on androidx.lifecycle.ViewModel.
Wraps a buffered Channel the same way BaseViewModel.emitEffect does, but takes only a CoroutineScope — for consumers whose ViewModel-equivalent isn't built on androidx.lifecycle.ViewModel (e.g. a hand-rolled presenter). Pure coroutines, no platform dependency, so it compiles on every target this library declares.