Implement subscription::unfold 🎉
This commit is contained in:
parent
7442d0b66f
commit
2a3271dc10
1 changed files with 22 additions and 1 deletions
|
|
@ -2,7 +2,8 @@
|
||||||
use crate::event::{self, Event};
|
use crate::event::{self, Event};
|
||||||
use crate::Hasher;
|
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 iced_futures::BoxStream;
|
||||||
|
|
||||||
use std::hash::Hash;
|
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>
|
struct Runner<T, F, S, Message>
|
||||||
where
|
where
|
||||||
F: FnOnce(T, EventStream) -> S,
|
F: FnOnce(T, EventStream) -> S,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue