diff options
author | 2024-07-05 02:34:39 +0200 | |
---|---|---|
committer | 2024-07-05 02:34:39 +0200 | |
commit | 978327f9e7f68d3e5bc280faa0617487d8eabc57 (patch) | |
tree | e0ea35f42d41568a792b0b22eb119226908cb6a7 /futures/src/stream.rs | |
parent | e50aa03edc858d561992d8ca441aa063f273eeac (diff) | |
parent | c9e0ed7ca4a7fce23450b9aeba6eb79244832521 (diff) | |
download | iced-978327f9e7f68d3e5bc280faa0617487d8eabc57.tar.gz iced-978327f9e7f68d3e5bc280faa0617487d8eabc57.tar.bz2 iced-978327f9e7f68d3e5bc280faa0617487d8eabc57.zip |
Merge pull request #2493 from iced-rs/hide-subscription-internals
Hide `Subscription` internals
Diffstat (limited to '')
-rw-r--r-- | futures/src/stream.rs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/futures/src/stream.rs b/futures/src/stream.rs new file mode 100644 index 00000000..2ec505f1 --- /dev/null +++ b/futures/src/stream.rs @@ -0,0 +1,26 @@ +//! Create asynchronous streams of data. +use futures::channel::mpsc; +use futures::never::Never; +use futures::stream::{self, Stream, StreamExt}; + +use std::future::Future; + +/// Creates a new [`Stream`] that produces the items sent from a [`Future`] +/// to the [`mpsc::Sender`] provided to the closure. +/// +/// This is a more ergonomic [`stream::unfold`], which allows you to go +/// from the "world of futures" to the "world of streams" by simply looping +/// and publishing to an async channel from inside a [`Future`]. +pub fn channel<T, F>( + size: usize, + f: impl FnOnce(mpsc::Sender<T>) -> F, +) -> impl Stream<Item = T> +where + F: Future<Output = Never>, +{ + let (sender, receiver) = mpsc::channel(size); + + let runner = stream::once(f(sender)).map(|_| unreachable!()); + + stream::select(receiver, runner) +} |