| //@ check-pass |
| //@ edition: 2021 |
| |
| // Make sure that we infer the args of an async closure even if it's passed to |
| // a function that requires the async closure implement `Fn*` but does *not* have |
| // a `Future` bound on the return type. |
| |
| #![feature(async_closure)] |
| |
| use std::future::Future; |
| |
| trait TryStream { |
| type Ok; |
| type Err; |
| } |
| |
| trait TryFuture { |
| type Ok; |
| type Err; |
| } |
| |
| impl<F, T, E> TryFuture for F where F: Future<Output = Result<T, E>> { |
| type Ok = T; |
| type Err = E; |
| } |
| |
| trait TryStreamExt: TryStream { |
| fn try_for_each<F, Fut>(&self, f: F) |
| where |
| F: FnMut(Self::Ok) -> Fut, |
| Fut: TryFuture<Ok = (), Err = Self::Err>; |
| } |
| |
| impl<S> TryStreamExt for S where S: TryStream { |
| fn try_for_each<F, Fut>(&self, f: F) |
| where |
| F: FnMut(Self::Ok) -> Fut, |
| Fut: TryFuture<Ok = (), Err = Self::Err>, |
| { } |
| } |
| |
| fn test(stream: impl TryStream<Ok = &'static str, Err = ()>) { |
| stream.try_for_each(async |s| { |
| s.trim(); // Make sure we know the type of `s` at this point. |
| Ok(()) |
| }); |
| } |
| |
| fn main() {} |