| 1 | //! Futures | 
| 2 | //! | 
|---|
| 3 | //! This module contains a number of functions for working with `Future`s, | 
|---|
| 4 | //! including the `FutureExt` trait which adds methods to `Future` types. | 
|---|
| 5 |  | 
|---|
| 6 | #[ cfg(feature = "alloc")] | 
|---|
| 7 | use alloc::boxed::Box; | 
|---|
| 8 | use core::pin::Pin; | 
|---|
| 9 |  | 
|---|
| 10 | use crate::fns::{inspect_fn, into_fn, ok_fn, InspectFn, IntoFn, OkFn}; | 
|---|
| 11 | use crate::future::{assert_future, Either}; | 
|---|
| 12 | use crate::never::Never; | 
|---|
| 13 | use crate::stream::assert_stream; | 
|---|
| 14 | #[ cfg(feature = "alloc")] | 
|---|
| 15 | use futures_core::future::{BoxFuture, LocalBoxFuture}; | 
|---|
| 16 | use futures_core::{ | 
|---|
| 17 | future::Future, | 
|---|
| 18 | stream::Stream, | 
|---|
| 19 | task::{Context, Poll}, | 
|---|
| 20 | }; | 
|---|
| 21 | use pin_utils::pin_mut; | 
|---|
| 22 |  | 
|---|
| 23 | // Combinators | 
|---|
| 24 |  | 
|---|
| 25 | mod flatten; | 
|---|
| 26 | mod fuse; | 
|---|
| 27 | mod map; | 
|---|
| 28 |  | 
|---|
| 29 | delegate_all!( | 
|---|
| 30 | /// Future for the [`flatten`](super::FutureExt::flatten) method. | 
|---|
| 31 | Flatten<F>( | 
|---|
| 32 | flatten::Flatten<F, <F as Future>::Output> | 
|---|
| 33 | ): Debug + Future + FusedFuture + New[|x: F| flatten::Flatten::new(x)] | 
|---|
| 34 | where F: Future | 
|---|
| 35 | ); | 
|---|
| 36 |  | 
|---|
| 37 | delegate_all!( | 
|---|
| 38 | /// Stream for the [`flatten_stream`](FutureExt::flatten_stream) method. | 
|---|
| 39 | FlattenStream<F>( | 
|---|
| 40 | flatten::Flatten<F, <F as Future>::Output> | 
|---|
| 41 | ): Debug + Sink + Stream + FusedStream + New[|x: F| flatten::Flatten::new(x)] | 
|---|
| 42 | where F: Future | 
|---|
| 43 | ); | 
|---|
| 44 |  | 
|---|
| 45 | #[ allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 | 
|---|
| 46 | pub use fuse::Fuse; | 
|---|
| 47 |  | 
|---|
| 48 | delegate_all!( | 
|---|
| 49 | /// Future for the [`map`](super::FutureExt::map) method. | 
|---|
| 50 | Map<Fut, F>( | 
|---|
| 51 | map::Map<Fut, F> | 
|---|
| 52 | ): Debug + Future + FusedFuture + New[|x: Fut, f: F| map::Map::new(x, f)] | 
|---|
| 53 | ); | 
|---|
| 54 |  | 
|---|
| 55 | delegate_all!( | 
|---|
| 56 | /// Stream for the [`into_stream`](FutureExt::into_stream) method. | 
|---|
| 57 | IntoStream<F>( | 
|---|
| 58 | crate::stream::Once<F> | 
|---|
| 59 | ): Debug + Stream + FusedStream + New[|x: F| crate::stream::Once::new(x)] | 
|---|
| 60 | ); | 
|---|
| 61 |  | 
|---|
| 62 | delegate_all!( | 
|---|
| 63 | /// Future for the [`map_into`](FutureExt::map_into) combinator. | 
|---|
| 64 | MapInto<Fut, T>( | 
|---|
| 65 | Map<Fut, IntoFn<T>> | 
|---|
| 66 | ): Debug + Future + FusedFuture + New[|x: Fut| Map::new(x, into_fn())] | 
|---|
| 67 | ); | 
|---|
| 68 |  | 
|---|
| 69 | delegate_all!( | 
|---|
| 70 | /// Future for the [`then`](FutureExt::then) method. | 
|---|
| 71 | Then<Fut1, Fut2, F>( | 
|---|
| 72 | flatten::Flatten<Map<Fut1, F>, Fut2> | 
|---|
| 73 | ): Debug + Future + FusedFuture + New[|x: Fut1, y: F| flatten::Flatten::new(Map::new(x, y))] | 
|---|
| 74 | ); | 
|---|
| 75 |  | 
|---|
| 76 | delegate_all!( | 
|---|
| 77 | /// Future for the [`inspect`](FutureExt::inspect) method. | 
|---|
| 78 | Inspect<Fut, F>( | 
|---|
| 79 | map::Map<Fut, InspectFn<F>> | 
|---|
| 80 | ): Debug + Future + FusedFuture + New[|x: Fut, f: F| map::Map::new(x, inspect_fn(f))] | 
|---|
| 81 | ); | 
|---|
| 82 |  | 
|---|
| 83 | delegate_all!( | 
|---|
| 84 | /// Future for the [`never_error`](super::FutureExt::never_error) combinator. | 
|---|
| 85 | NeverError<Fut>( | 
|---|
| 86 | Map<Fut, OkFn<Never>> | 
|---|
| 87 | ): Debug + Future + FusedFuture + New[|x: Fut| Map::new(x, ok_fn())] | 
|---|
| 88 | ); | 
|---|
| 89 |  | 
|---|
| 90 | delegate_all!( | 
|---|
| 91 | /// Future for the [`unit_error`](super::FutureExt::unit_error) combinator. | 
|---|
| 92 | UnitError<Fut>( | 
|---|
| 93 | Map<Fut, OkFn<()>> | 
|---|
| 94 | ): Debug + Future + FusedFuture + New[|x: Fut| Map::new(x, ok_fn())] | 
|---|
| 95 | ); | 
|---|
| 96 |  | 
|---|
| 97 | #[ cfg(feature = "std")] | 
|---|
| 98 | mod catch_unwind; | 
|---|
| 99 | #[ cfg(feature = "std")] | 
|---|
| 100 | #[ allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 | 
|---|
| 101 | pub use self::catch_unwind::CatchUnwind; | 
|---|
| 102 |  | 
|---|
| 103 | #[ cfg(feature = "channel")] | 
|---|
| 104 | #[ cfg_attr(docsrs, doc(cfg(feature = "channel")))] | 
|---|
| 105 | #[ cfg(feature = "std")] | 
|---|
| 106 | mod remote_handle; | 
|---|
| 107 | #[ cfg(feature = "channel")] | 
|---|
| 108 | #[ cfg_attr(docsrs, doc(cfg(feature = "channel")))] | 
|---|
| 109 | #[ cfg(feature = "std")] | 
|---|
| 110 | #[ allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 | 
|---|
| 111 | pub use self::remote_handle::{Remote, RemoteHandle}; | 
|---|
| 112 |  | 
|---|
| 113 | #[ cfg(feature = "std")] | 
|---|
| 114 | mod shared; | 
|---|
| 115 | #[ cfg(feature = "std")] | 
|---|
| 116 | #[ allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 | 
|---|
| 117 | pub use self::shared::{Shared, WeakShared}; | 
|---|
| 118 |  | 
|---|
| 119 | impl<T: ?Sized> FutureExt for T where T: Future {} | 
|---|
| 120 |  | 
|---|
| 121 | /// An extension trait for `Future`s that provides a variety of convenient | 
|---|
| 122 | /// adapters. | 
|---|
| 123 | pub trait FutureExt: Future { | 
|---|
| 124 | /// Map this future's output to a different type, returning a new future of | 
|---|
| 125 | /// the resulting type. | 
|---|
| 126 | /// | 
|---|
| 127 | /// This function is similar to the `Option::map` or `Iterator::map` where | 
|---|
| 128 | /// it will change the type of the underlying future. This is useful to | 
|---|
| 129 | /// chain along a computation once a future has been resolved. | 
|---|
| 130 | /// | 
|---|
| 131 | /// Note that this function consumes the receiving future and returns a | 
|---|
| 132 | /// wrapped version of it, similar to the existing `map` methods in the | 
|---|
| 133 | /// standard library. | 
|---|
| 134 | /// | 
|---|
| 135 | /// # Examples | 
|---|
| 136 | /// | 
|---|
| 137 | /// ``` | 
|---|
| 138 | /// # futures::executor::block_on(async { | 
|---|
| 139 | /// use futures::future::FutureExt; | 
|---|
| 140 | /// | 
|---|
| 141 | /// let future = async { 1 }; | 
|---|
| 142 | /// let new_future = future.map(|x| x + 3); | 
|---|
| 143 | /// assert_eq!(new_future.await, 4); | 
|---|
| 144 | /// # }); | 
|---|
| 145 | /// ``` | 
|---|
| 146 | fn map<U, F>(self, f: F) -> Map<Self, F> | 
|---|
| 147 | where | 
|---|
| 148 | F: FnOnce(Self::Output) -> U, | 
|---|
| 149 | Self: Sized, | 
|---|
| 150 | { | 
|---|
| 151 | assert_future::<U, _>(Map::new(self, f)) | 
|---|
| 152 | } | 
|---|
| 153 |  | 
|---|
| 154 | /// Map this future's output to a different type, returning a new future of | 
|---|
| 155 | /// the resulting type. | 
|---|
| 156 | /// | 
|---|
| 157 | /// This function is equivalent to calling `map(Into::into)` but allows naming | 
|---|
| 158 | /// the return type. | 
|---|
| 159 | fn map_into<U>(self) -> MapInto<Self, U> | 
|---|
| 160 | where | 
|---|
| 161 | Self::Output: Into<U>, | 
|---|
| 162 | Self: Sized, | 
|---|
| 163 | { | 
|---|
| 164 | assert_future::<U, _>(MapInto::new(self)) | 
|---|
| 165 | } | 
|---|
| 166 |  | 
|---|
| 167 | /// Chain on a computation for when a future finished, passing the result of | 
|---|
| 168 | /// the future to the provided closure `f`. | 
|---|
| 169 | /// | 
|---|
| 170 | /// The returned value of the closure must implement the `Future` trait | 
|---|
| 171 | /// and can represent some more work to be done before the composed future | 
|---|
| 172 | /// is finished. | 
|---|
| 173 | /// | 
|---|
| 174 | /// The closure `f` is only run *after* successful completion of the `self` | 
|---|
| 175 | /// future. | 
|---|
| 176 | /// | 
|---|
| 177 | /// Note that this function consumes the receiving future and returns a | 
|---|
| 178 | /// wrapped version of it. | 
|---|
| 179 | /// | 
|---|
| 180 | /// # Examples | 
|---|
| 181 | /// | 
|---|
| 182 | /// ``` | 
|---|
| 183 | /// # futures::executor::block_on(async { | 
|---|
| 184 | /// use futures::future::FutureExt; | 
|---|
| 185 | /// | 
|---|
| 186 | /// let future_of_1 = async { 1 }; | 
|---|
| 187 | /// let future_of_4 = future_of_1.then(|x| async move { x + 3 }); | 
|---|
| 188 | /// assert_eq!(future_of_4.await, 4); | 
|---|
| 189 | /// # }); | 
|---|
| 190 | /// ``` | 
|---|
| 191 | fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F> | 
|---|
| 192 | where | 
|---|
| 193 | F: FnOnce(Self::Output) -> Fut, | 
|---|
| 194 | Fut: Future, | 
|---|
| 195 | Self: Sized, | 
|---|
| 196 | { | 
|---|
| 197 | assert_future::<Fut::Output, _>(Then::new(self, f)) | 
|---|
| 198 | } | 
|---|
| 199 |  | 
|---|
| 200 | /// Wrap this future in an `Either` future, making it the left-hand variant | 
|---|
| 201 | /// of that `Either`. | 
|---|
| 202 | /// | 
|---|
| 203 | /// This can be used in combination with the `right_future` method to write `if` | 
|---|
| 204 | /// statements that evaluate to different futures in different branches. | 
|---|
| 205 | /// | 
|---|
| 206 | /// # Examples | 
|---|
| 207 | /// | 
|---|
| 208 | /// ``` | 
|---|
| 209 | /// # futures::executor::block_on(async { | 
|---|
| 210 | /// use futures::future::FutureExt; | 
|---|
| 211 | /// | 
|---|
| 212 | /// let x = 6; | 
|---|
| 213 | /// let future = if x < 10 { | 
|---|
| 214 | ///     async { true }.left_future() | 
|---|
| 215 | /// } else { | 
|---|
| 216 | ///     async { false }.right_future() | 
|---|
| 217 | /// }; | 
|---|
| 218 | /// | 
|---|
| 219 | /// assert_eq!(future.await, true); | 
|---|
| 220 | /// # }); | 
|---|
| 221 | /// ``` | 
|---|
| 222 | fn left_future<B>(self) -> Either<Self, B> | 
|---|
| 223 | where | 
|---|
| 224 | B: Future<Output = Self::Output>, | 
|---|
| 225 | Self: Sized, | 
|---|
| 226 | { | 
|---|
| 227 | assert_future::<Self::Output, _>(Either::Left(self)) | 
|---|
| 228 | } | 
|---|
| 229 |  | 
|---|
| 230 | /// Wrap this future in an `Either` future, making it the right-hand variant | 
|---|
| 231 | /// of that `Either`. | 
|---|
| 232 | /// | 
|---|
| 233 | /// This can be used in combination with the `left_future` method to write `if` | 
|---|
| 234 | /// statements that evaluate to different futures in different branches. | 
|---|
| 235 | /// | 
|---|
| 236 | /// # Examples | 
|---|
| 237 | /// | 
|---|
| 238 | /// ``` | 
|---|
| 239 | /// # futures::executor::block_on(async { | 
|---|
| 240 | /// use futures::future::FutureExt; | 
|---|
| 241 | /// | 
|---|
| 242 | /// let x = 6; | 
|---|
| 243 | /// let future = if x > 10 { | 
|---|
| 244 | ///     async { true }.left_future() | 
|---|
| 245 | /// } else { | 
|---|
| 246 | ///     async { false }.right_future() | 
|---|
| 247 | /// }; | 
|---|
| 248 | /// | 
|---|
| 249 | /// assert_eq!(future.await, false); | 
|---|
| 250 | /// # }); | 
|---|
| 251 | /// ``` | 
|---|
| 252 | fn right_future<A>(self) -> Either<A, Self> | 
|---|
| 253 | where | 
|---|
| 254 | A: Future<Output = Self::Output>, | 
|---|
| 255 | Self: Sized, | 
|---|
| 256 | { | 
|---|
| 257 | assert_future::<Self::Output, _>(Either::Right(self)) | 
|---|
| 258 | } | 
|---|
| 259 |  | 
|---|
| 260 | /// Convert this future into a single element stream. | 
|---|
| 261 | /// | 
|---|
| 262 | /// The returned stream contains single success if this future resolves to | 
|---|
| 263 | /// success or single error if this future resolves into error. | 
|---|
| 264 | /// | 
|---|
| 265 | /// # Examples | 
|---|
| 266 | /// | 
|---|
| 267 | /// ``` | 
|---|
| 268 | /// # futures::executor::block_on(async { | 
|---|
| 269 | /// use futures::future::FutureExt; | 
|---|
| 270 | /// use futures::stream::StreamExt; | 
|---|
| 271 | /// | 
|---|
| 272 | /// let future = async { 17 }; | 
|---|
| 273 | /// let stream = future.into_stream(); | 
|---|
| 274 | /// let collected: Vec<_> = stream.collect().await; | 
|---|
| 275 | /// assert_eq!(collected, vec![17]); | 
|---|
| 276 | /// # }); | 
|---|
| 277 | /// ``` | 
|---|
| 278 | fn into_stream(self) -> IntoStream<Self> | 
|---|
| 279 | where | 
|---|
| 280 | Self: Sized, | 
|---|
| 281 | { | 
|---|
| 282 | assert_stream::<Self::Output, _>(IntoStream::new(self)) | 
|---|
| 283 | } | 
|---|
| 284 |  | 
|---|
| 285 | /// Flatten the execution of this future when the output of this | 
|---|
| 286 | /// future is itself another future. | 
|---|
| 287 | /// | 
|---|
| 288 | /// This can be useful when combining futures together to flatten the | 
|---|
| 289 | /// computation out the final result. | 
|---|
| 290 | /// | 
|---|
| 291 | /// This method is roughly equivalent to `self.then(|x| x)`. | 
|---|
| 292 | /// | 
|---|
| 293 | /// Note that this function consumes the receiving future and returns a | 
|---|
| 294 | /// wrapped version of it. | 
|---|
| 295 | /// | 
|---|
| 296 | /// # Examples | 
|---|
| 297 | /// | 
|---|
| 298 | /// ``` | 
|---|
| 299 | /// # futures::executor::block_on(async { | 
|---|
| 300 | /// use futures::future::FutureExt; | 
|---|
| 301 | /// | 
|---|
| 302 | /// let nested_future = async { async { 1 } }; | 
|---|
| 303 | /// let future = nested_future.flatten(); | 
|---|
| 304 | /// assert_eq!(future.await, 1); | 
|---|
| 305 | /// # }); | 
|---|
| 306 | /// ``` | 
|---|
| 307 | fn flatten(self) -> Flatten<Self> | 
|---|
| 308 | where | 
|---|
| 309 | Self::Output: Future, | 
|---|
| 310 | Self: Sized, | 
|---|
| 311 | { | 
|---|
| 312 | let f = Flatten::new(self); | 
|---|
| 313 | assert_future::<<<Self as Future>::Output as Future>::Output, _>(f) | 
|---|
| 314 | } | 
|---|
| 315 |  | 
|---|
| 316 | /// Flatten the execution of this future when the successful result of this | 
|---|
| 317 | /// future is a stream. | 
|---|
| 318 | /// | 
|---|
| 319 | /// This can be useful when stream initialization is deferred, and it is | 
|---|
| 320 | /// convenient to work with that stream as if stream was available at the | 
|---|
| 321 | /// call site. | 
|---|
| 322 | /// | 
|---|
| 323 | /// Note that this function consumes this future and returns a wrapped | 
|---|
| 324 | /// version of it. | 
|---|
| 325 | /// | 
|---|
| 326 | /// # Examples | 
|---|
| 327 | /// | 
|---|
| 328 | /// ``` | 
|---|
| 329 | /// # futures::executor::block_on(async { | 
|---|
| 330 | /// use futures::future::FutureExt; | 
|---|
| 331 | /// use futures::stream::{self, StreamExt}; | 
|---|
| 332 | /// | 
|---|
| 333 | /// let stream_items = vec![17, 18, 19]; | 
|---|
| 334 | /// let future_of_a_stream = async { stream::iter(stream_items) }; | 
|---|
| 335 | /// | 
|---|
| 336 | /// let stream = future_of_a_stream.flatten_stream(); | 
|---|
| 337 | /// let list: Vec<_> = stream.collect().await; | 
|---|
| 338 | /// assert_eq!(list, vec![17, 18, 19]); | 
|---|
| 339 | /// # }); | 
|---|
| 340 | /// ``` | 
|---|
| 341 | fn flatten_stream(self) -> FlattenStream<Self> | 
|---|
| 342 | where | 
|---|
| 343 | Self::Output: Stream, | 
|---|
| 344 | Self: Sized, | 
|---|
| 345 | { | 
|---|
| 346 | assert_stream::<<Self::Output as Stream>::Item, _>(FlattenStream::new(self)) | 
|---|
| 347 | } | 
|---|
| 348 |  | 
|---|
| 349 | /// Fuse a future such that `poll` will never again be called once it has | 
|---|
| 350 | /// completed. This method can be used to turn any `Future` into a | 
|---|
| 351 | /// `FusedFuture`. | 
|---|
| 352 | /// | 
|---|
| 353 | /// Normally, once a future has returned `Poll::Ready` from `poll`, | 
|---|
| 354 | /// any further calls could exhibit bad behavior such as blocking | 
|---|
| 355 | /// forever, panicking, never returning, etc. If it is known that `poll` | 
|---|
| 356 | /// may be called too often then this method can be used to ensure that it | 
|---|
| 357 | /// has defined semantics. | 
|---|
| 358 | /// | 
|---|
| 359 | /// If a `fuse`d future is `poll`ed after having returned `Poll::Ready` | 
|---|
| 360 | /// previously, it will return `Poll::Pending`, from `poll` again (and will | 
|---|
| 361 | /// continue to do so for all future calls to `poll`). | 
|---|
| 362 | /// | 
|---|
| 363 | /// This combinator will drop the underlying future as soon as it has been | 
|---|
| 364 | /// completed to ensure resources are reclaimed as soon as possible. | 
|---|
| 365 | fn fuse(self) -> Fuse<Self> | 
|---|
| 366 | where | 
|---|
| 367 | Self: Sized, | 
|---|
| 368 | { | 
|---|
| 369 | let f = Fuse::new(self); | 
|---|
| 370 | assert_future::<Self::Output, _>(f) | 
|---|
| 371 | } | 
|---|
| 372 |  | 
|---|
| 373 | /// Do something with the output of a future before passing it on. | 
|---|
| 374 | /// | 
|---|
| 375 | /// When using futures, you'll often chain several of them together.  While | 
|---|
| 376 | /// working on such code, you might want to check out what's happening at | 
|---|
| 377 | /// various parts in the pipeline, without consuming the intermediate | 
|---|
| 378 | /// value. To do that, insert a call to `inspect`. | 
|---|
| 379 | /// | 
|---|
| 380 | /// # Examples | 
|---|
| 381 | /// | 
|---|
| 382 | /// ``` | 
|---|
| 383 | /// # futures::executor::block_on(async { | 
|---|
| 384 | /// use futures::future::FutureExt; | 
|---|
| 385 | /// | 
|---|
| 386 | /// let future = async { 1 }; | 
|---|
| 387 | /// let new_future = future.inspect(|&x| println!( "about to resolve: {}", x)); | 
|---|
| 388 | /// assert_eq!(new_future.await, 1); | 
|---|
| 389 | /// # }); | 
|---|
| 390 | /// ``` | 
|---|
| 391 | fn inspect<F>(self, f: F) -> Inspect<Self, F> | 
|---|
| 392 | where | 
|---|
| 393 | F: FnOnce(&Self::Output), | 
|---|
| 394 | Self: Sized, | 
|---|
| 395 | { | 
|---|
| 396 | assert_future::<Self::Output, _>(Inspect::new(self, f)) | 
|---|
| 397 | } | 
|---|
| 398 |  | 
|---|
| 399 | /// Catches unwinding panics while polling the future. | 
|---|
| 400 | /// | 
|---|
| 401 | /// In general, panics within a future can propagate all the way out to the | 
|---|
| 402 | /// task level. This combinator makes it possible to halt unwinding within | 
|---|
| 403 | /// the future itself. It's most commonly used within task executors. It's | 
|---|
| 404 | /// not recommended to use this for error handling. | 
|---|
| 405 | /// | 
|---|
| 406 | /// Note that this method requires the `UnwindSafe` bound from the standard | 
|---|
| 407 | /// library. This isn't always applied automatically, and the standard | 
|---|
| 408 | /// library provides an `AssertUnwindSafe` wrapper type to apply it | 
|---|
| 409 | /// after-the fact. To assist using this method, the `Future` trait is also | 
|---|
| 410 | /// implemented for `AssertUnwindSafe<F>` where `F` implements `Future`. | 
|---|
| 411 | /// | 
|---|
| 412 | /// This method is only available when the `std` feature of this | 
|---|
| 413 | /// library is activated, and it is activated by default. | 
|---|
| 414 | /// | 
|---|
| 415 | /// # Examples | 
|---|
| 416 | /// | 
|---|
| 417 | /// ``` | 
|---|
| 418 | /// # futures::executor::block_on(async { | 
|---|
| 419 | /// use futures::future::{self, FutureExt, Ready}; | 
|---|
| 420 | /// | 
|---|
| 421 | /// let future = future::ready(2); | 
|---|
| 422 | /// assert!(future.catch_unwind().await.is_ok()); | 
|---|
| 423 | /// | 
|---|
| 424 | /// let future = future::lazy(|_| -> Ready<i32> { | 
|---|
| 425 | ///     unimplemented!() | 
|---|
| 426 | /// }); | 
|---|
| 427 | /// assert!(future.catch_unwind().await.is_err()); | 
|---|
| 428 | /// # }); | 
|---|
| 429 | /// ``` | 
|---|
| 430 | #[ cfg(feature = "std")] | 
|---|
| 431 | fn catch_unwind(self) -> CatchUnwind<Self> | 
|---|
| 432 | where | 
|---|
| 433 | Self: Sized + ::std::panic::UnwindSafe, | 
|---|
| 434 | { | 
|---|
| 435 | assert_future::<Result<Self::Output, Box<dyn std::any::Any + Send>>, _>(CatchUnwind::new( | 
|---|
| 436 | self, | 
|---|
| 437 | )) | 
|---|
| 438 | } | 
|---|
| 439 |  | 
|---|
| 440 | /// Create a cloneable handle to this future where all handles will resolve | 
|---|
| 441 | /// to the same result. | 
|---|
| 442 | /// | 
|---|
| 443 | /// The `shared` combinator method provides a method to convert any future | 
|---|
| 444 | /// into a cloneable future. It enables a future to be polled by multiple | 
|---|
| 445 | /// threads. | 
|---|
| 446 | /// | 
|---|
| 447 | /// This method is only available when the `std` feature of this | 
|---|
| 448 | /// library is activated, and it is activated by default. | 
|---|
| 449 | /// | 
|---|
| 450 | /// # Examples | 
|---|
| 451 | /// | 
|---|
| 452 | /// ``` | 
|---|
| 453 | /// # futures::executor::block_on(async { | 
|---|
| 454 | /// use futures::future::FutureExt; | 
|---|
| 455 | /// | 
|---|
| 456 | /// let future = async { 6 }; | 
|---|
| 457 | /// let shared1 = future.shared(); | 
|---|
| 458 | /// let shared2 = shared1.clone(); | 
|---|
| 459 | /// | 
|---|
| 460 | /// assert_eq!(6, shared1.await); | 
|---|
| 461 | /// assert_eq!(6, shared2.await); | 
|---|
| 462 | /// # }); | 
|---|
| 463 | /// ``` | 
|---|
| 464 | /// | 
|---|
| 465 | /// ``` | 
|---|
| 466 | /// # futures::executor::block_on(async { | 
|---|
| 467 | /// use futures::future::FutureExt; | 
|---|
| 468 | /// use futures::executor::block_on; | 
|---|
| 469 | /// use std::thread; | 
|---|
| 470 | /// | 
|---|
| 471 | /// let future = async { 6 }; | 
|---|
| 472 | /// let shared1 = future.shared(); | 
|---|
| 473 | /// let shared2 = shared1.clone(); | 
|---|
| 474 | /// let join_handle = thread::spawn(move || { | 
|---|
| 475 | ///     assert_eq!(6, block_on(shared2)); | 
|---|
| 476 | /// }); | 
|---|
| 477 | /// assert_eq!(6, shared1.await); | 
|---|
| 478 | /// join_handle.join().unwrap(); | 
|---|
| 479 | /// # }); | 
|---|
| 480 | /// ``` | 
|---|
| 481 | #[ cfg(feature = "std")] | 
|---|
| 482 | fn shared(self) -> Shared<Self> | 
|---|
| 483 | where | 
|---|
| 484 | Self: Sized, | 
|---|
| 485 | Self::Output: Clone, | 
|---|
| 486 | { | 
|---|
| 487 | assert_future::<Self::Output, _>(Shared::new(self)) | 
|---|
| 488 | } | 
|---|
| 489 |  | 
|---|
| 490 | /// Turn this future into a future that yields `()` on completion and sends | 
|---|
| 491 | /// its output to another future on a separate task. | 
|---|
| 492 | /// | 
|---|
| 493 | /// This can be used with spawning executors to easily retrieve the result | 
|---|
| 494 | /// of a future executing on a separate task or thread. | 
|---|
| 495 | /// | 
|---|
| 496 | /// This method is only available when the `std` feature of this | 
|---|
| 497 | /// library is activated, and it is activated by default. | 
|---|
| 498 | #[ cfg(feature = "channel")] | 
|---|
| 499 | #[ cfg_attr(docsrs, doc(cfg(feature = "channel")))] | 
|---|
| 500 | #[ cfg(feature = "std")] | 
|---|
| 501 | fn remote_handle(self) -> (Remote<Self>, RemoteHandle<Self::Output>) | 
|---|
| 502 | where | 
|---|
| 503 | Self: Sized, | 
|---|
| 504 | { | 
|---|
| 505 | let (wrapped, handle) = remote_handle::remote_handle(self); | 
|---|
| 506 | (assert_future::<(), _>(wrapped), handle) | 
|---|
| 507 | } | 
|---|
| 508 |  | 
|---|
| 509 | /// Wrap the future in a Box, pinning it. | 
|---|
| 510 | /// | 
|---|
| 511 | /// This method is only available when the `std` or `alloc` feature of this | 
|---|
| 512 | /// library is activated, and it is activated by default. | 
|---|
| 513 | #[ cfg(feature = "alloc")] | 
|---|
| 514 | fn boxed<'a>(self) -> BoxFuture<'a, Self::Output> | 
|---|
| 515 | where | 
|---|
| 516 | Self: Sized + Send + 'a, | 
|---|
| 517 | { | 
|---|
| 518 | assert_future::<Self::Output, _>(Box::pin(self)) | 
|---|
| 519 | } | 
|---|
| 520 |  | 
|---|
| 521 | /// Wrap the future in a Box, pinning it. | 
|---|
| 522 | /// | 
|---|
| 523 | /// Similar to `boxed`, but without the `Send` requirement. | 
|---|
| 524 | /// | 
|---|
| 525 | /// This method is only available when the `std` or `alloc` feature of this | 
|---|
| 526 | /// library is activated, and it is activated by default. | 
|---|
| 527 | #[ cfg(feature = "alloc")] | 
|---|
| 528 | fn boxed_local<'a>(self) -> LocalBoxFuture<'a, Self::Output> | 
|---|
| 529 | where | 
|---|
| 530 | Self: Sized + 'a, | 
|---|
| 531 | { | 
|---|
| 532 | assert_future::<Self::Output, _>(Box::pin(self)) | 
|---|
| 533 | } | 
|---|
| 534 |  | 
|---|
| 535 | /// Turns a [`Future<Output = T>`](Future) into a | 
|---|
| 536 | /// [`TryFuture<Ok = T, Error = ()`>](futures_core::future::TryFuture). | 
|---|
| 537 | fn unit_error(self) -> UnitError<Self> | 
|---|
| 538 | where | 
|---|
| 539 | Self: Sized, | 
|---|
| 540 | { | 
|---|
| 541 | assert_future::<Result<Self::Output, ()>, _>(UnitError::new(self)) | 
|---|
| 542 | } | 
|---|
| 543 |  | 
|---|
| 544 | /// Turns a [`Future<Output = T>`](Future) into a | 
|---|
| 545 | /// [`TryFuture<Ok = T, Error = Never`>](futures_core::future::TryFuture). | 
|---|
| 546 | fn never_error(self) -> NeverError<Self> | 
|---|
| 547 | where | 
|---|
| 548 | Self: Sized, | 
|---|
| 549 | { | 
|---|
| 550 | assert_future::<Result<Self::Output, Never>, _>(NeverError::new(self)) | 
|---|
| 551 | } | 
|---|
| 552 |  | 
|---|
| 553 | /// A convenience for calling `Future::poll` on `Unpin` future types. | 
|---|
| 554 | fn poll_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Self::Output> | 
|---|
| 555 | where | 
|---|
| 556 | Self: Unpin, | 
|---|
| 557 | { | 
|---|
| 558 | Pin::new(self).poll(cx) | 
|---|
| 559 | } | 
|---|
| 560 |  | 
|---|
| 561 | /// Evaluates and consumes the future, returning the resulting output if | 
|---|
| 562 | /// the future is ready after the first call to `Future::poll`. | 
|---|
| 563 | /// | 
|---|
| 564 | /// If `poll` instead returns `Poll::Pending`, `None` is returned. | 
|---|
| 565 | /// | 
|---|
| 566 | /// This method is useful in cases where immediacy is more important than | 
|---|
| 567 | /// waiting for a result. It is also convenient for quickly obtaining | 
|---|
| 568 | /// the value of a future that is known to always resolve immediately. | 
|---|
| 569 | /// | 
|---|
| 570 | /// # Examples | 
|---|
| 571 | /// | 
|---|
| 572 | /// ``` | 
|---|
| 573 | /// # use futures::prelude::*; | 
|---|
| 574 | /// use futures::{future::ready, future::pending}; | 
|---|
| 575 | /// let future_ready = ready( "foobar"); | 
|---|
| 576 | /// let future_pending = pending::<&'static str>(); | 
|---|
| 577 | /// | 
|---|
| 578 | /// assert_eq!(future_ready.now_or_never(), Some( "foobar")); | 
|---|
| 579 | /// assert_eq!(future_pending.now_or_never(), None); | 
|---|
| 580 | /// ``` | 
|---|
| 581 | /// | 
|---|
| 582 | /// In cases where it is absolutely known that a future should always | 
|---|
| 583 | /// resolve immediately and never return `Poll::Pending`, this method can | 
|---|
| 584 | /// be combined with `expect()`: | 
|---|
| 585 | /// | 
|---|
| 586 | /// ``` | 
|---|
| 587 | /// # use futures::{prelude::*, future::ready}; | 
|---|
| 588 | /// let future_ready = ready( "foobar"); | 
|---|
| 589 | /// | 
|---|
| 590 | /// assert_eq!(future_ready.now_or_never().expect( "Future not ready"), "foobar"); | 
|---|
| 591 | /// ``` | 
|---|
| 592 | fn now_or_never(self) -> Option<Self::Output> | 
|---|
| 593 | where | 
|---|
| 594 | Self: Sized, | 
|---|
| 595 | { | 
|---|
| 596 | let noop_waker = crate::task::noop_waker(); | 
|---|
| 597 | let mut cx = Context::from_waker(&noop_waker); | 
|---|
| 598 |  | 
|---|
| 599 | let this = self; | 
|---|
| 600 | pin_mut!(this); | 
|---|
| 601 | match this.poll(&mut cx) { | 
|---|
| 602 | Poll::Ready(x) => Some(x), | 
|---|
| 603 | _ => None, | 
|---|
| 604 | } | 
|---|
| 605 | } | 
|---|
| 606 | } | 
|---|
| 607 |  | 
|---|