summaryrefslogtreecommitdiffstats
path: root/futures/src/stream.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector@hecrj.dev>2024-07-05 02:34:39 +0200
committerLibravatar GitHub <noreply@github.com>2024-07-05 02:34:39 +0200
commit978327f9e7f68d3e5bc280faa0617487d8eabc57 (patch)
treee0ea35f42d41568a792b0b22eb119226908cb6a7 /futures/src/stream.rs
parente50aa03edc858d561992d8ca441aa063f273eeac (diff)
parentc9e0ed7ca4a7fce23450b9aeba6eb79244832521 (diff)
downloadiced-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 'futures/src/stream.rs')
-rw-r--r--futures/src/stream.rs26
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)
+}