usesuper::assert_sink; usecrate::unfold_state::UnfoldState; use core::{future::Future, pin::Pin}; use futures_core::ready; use futures_core::task::{Context, Poll}; use futures_sink::Sink; use pin_project_lite::pin_project;
pin_project! { /// Sink for the [`unfold`] function. #[derive(Debug)] #[must_use = "sinks do nothing unless polled"] pubstruct Unfold<T, F, R> {
function: F, #[pin]
state: UnfoldState<T, R>,
}
}
/// Create a sink from a function which processes one item at a time. /// /// # Examples /// /// ``` /// # futures::executor::block_on(async { /// use futures::sink::{self, SinkExt}; /// /// let unfold = sink::unfold(0, |mut sum, i: i32| { /// async move { /// sum += i; /// eprintln!("{}", i); /// Ok::<_, futures::never::Never>(sum) /// } /// }); /// futures::pin_mut!(unfold); /// unfold.send(5).await?; /// # Ok::<(), futures::never::Never>(()) }).unwrap(); /// ``` pubfn unfold<T, F, R, Item, E>(init: T, function: F) -> Unfold<T, F, R> where
F: FnMut(T, Item) -> R,
R: Future<Output = Result<T, E>>,
{
assert_sink::<Item, E, _>(Unfold { function, state: UnfoldState::Value { value: init } })
}
impl<T, F, R, Item, E> Sink<Item> for Unfold<T, F, R> where
F: FnMut(T, Item) -> R,
R: Future<Output = Result<T, E>>,
{ type Error = E;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.