Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up
Find file
Copy path
Fetching contributors…
| use core::marker::Unpin; | |
| use core::pin::Pin; | |
| use futures_core::future::Future; | |
| use futures_core::task::{LocalWaker, Poll}; | |
| use pin_utils::{unsafe_pinned, unsafe_unpinned}; | |
| /// Do something with the item of a future, passing it on. | |
| /// | |
| /// This is created by the [`super::FutureExt::inspect`] method. | |
| #[derive(Debug)] | |
| #[must_use = "futures do nothing unless polled"] | |
| pub struct Inspect<Fut, F> where Fut: Future { | |
| future: Fut, | |
| f: Option<F>, | |
| } | |
| impl<Fut: Future, F: FnOnce(&Fut::Output)> Inspect<Fut, F> { | |
| unsafe_pinned!(future: Fut); | |
| unsafe_unpinned!(f: Option<F>); | |
| pub(super) fn new(future: Fut, f: F) -> Inspect<Fut, F> { | |
| Inspect { | |
| future, | |
| f: Some(f), | |
| } | |
| } | |
| } | |
| impl<Fut: Future + Unpin, F> Unpin for Inspect<Fut, F> {} | |
| impl<Fut, F> Future for Inspect<Fut, F> | |
| where Fut: Future, | |
| F: FnOnce(&Fut::Output), | |
| { | |
| type Output = Fut::Output; | |
| fn poll(mut self: Pin<&mut Self>, lw: &LocalWaker) -> Poll<Fut::Output> { | |
| let e = match self.future().poll(lw) { | |
| Poll::Pending => return Poll::Pending, | |
| Poll::Ready(e) => e, | |
| }; | |
| let f = self.f().take().expect("cannot poll Inspect twice"); | |
| f(&e); | |
| Poll::Ready(e) | |
| } | |
| } |