//! Internal macros macro_rules! opaque_future { ($(#[$m:meta])* pub type $name:ident = $actual:ty;) => { opaque_future! { $(#[$m])* pub type $name<> = $actual; } }; ($(#[$m:meta])* pub type $name:ident<$($param:ident),*> = $actual:ty;) => { pin_project_lite::pin_project! { $(#[$m])* pub struct $name<$($param),*> { #[pin] future: $actual, } } impl<$($param),*> $name<$($param),*> { pub(crate) fn new(future: $actual) -> Self { Self { future } } } impl<$($param),*> std::fmt::Debug for $name<$($param),*> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct(stringify!($name)).finish_non_exhaustive() } } impl<$($param),*> std::future::Future for $name<$($param),*> where $actual: std::future::Future, { type Output = <$actual as std::future::Future>::Output; #[inline] fn poll( self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>, ) -> std::task::Poll { self.project().future.poll(cx) } } }; } #[rustfmt::skip] macro_rules! all_the_tuples { ($name:ident) => { $name!([], T1); $name!([T1], T2); $name!([T1, T2], T3); $name!([T1, T2, T3], T4); $name!([T1, T2, T3, T4], T5); $name!([T1, T2, T3, T4, T5], T6); $name!([T1, T2, T3, T4, T5, T6], T7); $name!([T1, T2, T3, T4, T5, T6, T7], T8); $name!([T1, T2, T3, T4, T5, T6, T7, T8], T9); $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9], T10); $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10], T11); $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11], T12); $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12], T13); $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13], T14); $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14], T15); $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15], T16); }; }