Implement subscription::unfold 🎉

This commit is contained in:
Héctor Ramón Jiménez 2022-01-14 19:55:27 +07:00
parent 7442d0b66f
commit 2a3271dc10
No known key found for this signature in database
GPG key ID: 140CC052C94F138E

View file

@ -2,7 +2,8 @@
use crate::event::{self, Event};
use crate::Hasher;
use iced_futures::futures::{self, Stream};
use iced_futures::futures::channel::mpsc;
use iced_futures::futures::{self, Future, Stream};
use iced_futures::BoxStream;
use std::hash::Hash;
@ -103,6 +104,26 @@ where
})
}
/// Returns a [`Subscription`] that will create and asynchronously run a
/// [`Stream`] that will call the provided closure to produce every `Message`.
///
/// The `initial` state will be used to uniquely identify the [`Subscription`].
pub fn unfold<T, Fut, Message>(
initial: T,
mut f: impl FnMut(T) -> Fut + Send + Sync + 'static,
) -> Subscription<Message>
where
Message: 'static,
T: Clone + Hash + Send + 'static,
Fut: Future<Output = (Message, T)> + Send + 'static,
{
use futures::future::FutureExt;
run(initial, move |initial| {
futures::stream::unfold(initial, move |state| f(state).map(Some))
})
}
struct Runner<T, F, S, Message>
where
F: FnOnce(T, EventStream) -> S,