Merge pull request #2497 from iced-rs/stream-try-channel

Introduce `stream::try_channel` helper
This commit is contained in:
Héctor Ramón 2024-07-11 04:18:32 +02:00 committed by GitHub
commit d894434237
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -23,3 +23,24 @@ where
stream::select(receiver, runner)
}
/// Creates a new [`Stream`] that produces the items sent from a [`Future`]
/// that can fail to the [`mpsc::Sender`] provided to the closure.
pub fn try_channel<T, E, F>(
size: usize,
f: impl FnOnce(mpsc::Sender<T>) -> F,
) -> impl Stream<Item = Result<T, E>>
where
F: Future<Output = Result<(), E>>,
{
let (sender, receiver) = mpsc::channel(size);
let runner = stream::once(f(sender)).filter_map(|result| async {
match result {
Ok(()) => None,
Err(error) => Some(Err(error)),
}
});
stream::select(receiver.map(Ok), runner)
}