#[macro_export]
macro_rules! select {
(@ [$($arms:tt)*]) => {
$crate::__select_impl!($($arms)* ; no_default)
};
(@ [$($arms:tt)*] default => $default:expr $(,)?) => {
$crate::__select_impl!($($arms)* ; default { $default })
};
(@ [$($arms:tt)*] $var:pat = $fut:expr => $body:expr, $($rest:tt)*) => {
$crate::select!(@ [$($arms)* $var = $fut => $body,] $($rest)*)
};
(@ [$($arms:tt)*] $var:pat = $fut:expr => $body:expr) => {
$crate::__select_impl!($($arms)* $var = $fut => $body, ; no_default)
};
($($input:tt)*) => {
$crate::select!(@ [] $($input)*)
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! __select_impl {
($v1:pat = $f1:expr => $b1:expr, ; no_default) => {{
let $v1 = $f1.await;
$b1
}};
($v1:pat = $f1:expr => $b1:expr, ; default { $default:expr }) => {{
let mut f1 = core::pin::pin!($f1);
::futures_lite::future::poll_fn(|cx| {
if let core::task::Poll::Ready(v) = f1.as_mut().poll(cx) {
let $v1 = v;
return core::task::Poll::Ready($b1);
}
core::task::Poll::Ready($default)
})
.await
}};
($v1:pat = $f1:expr => $b1:expr, $v2:pat = $f2:expr => $b2:expr, ; no_default) => {{
let mut f1 = core::pin::pin!($f1);
let mut f2 = core::pin::pin!($f2);
::futures_lite::future::poll_fn(|cx| {
if let core::task::Poll::Ready(v) = f1.as_mut().poll(cx) {
let $v1 = v;
return core::task::Poll::Ready($b1);
}
if let core::task::Poll::Ready(v) = f2.as_mut().poll(cx) {
let $v2 = v;
return core::task::Poll::Ready($b2);
}
core::task::Poll::Pending
})
.await
}};
($v1:pat = $f1:expr => $b1:expr, $v2:pat = $f2:expr => $b2:expr, ; default { $default:expr }) => {{
let mut f1 = core::pin::pin!($f1);
let mut f2 = core::pin::pin!($f2);
::futures_lite::future::poll_fn(|cx| {
if let core::task::Poll::Ready(v) = f1.as_mut().poll(cx) {
let $v1 = v;
return core::task::Poll::Ready($b1);
}
if let core::task::Poll::Ready(v) = f2.as_mut().poll(cx) {
let $v2 = v;
return core::task::Poll::Ready($b2);
}
core::task::Poll::Ready($default)
})
.await
}};
($v1:pat = $f1:expr => $b1:expr, $v2:pat = $f2:expr => $b2:expr, $v3:pat = $f3:expr => $b3:expr, ; no_default) => {{
let mut f1 = core::pin::pin!($f1);
let mut f2 = core::pin::pin!($f2);
let mut f3 = core::pin::pin!($f3);
::futures_lite::future::poll_fn(|cx| {
if let core::task::Poll::Ready(v) = f1.as_mut().poll(cx) {
let $v1 = v;
return core::task::Poll::Ready($b1);
}
if let core::task::Poll::Ready(v) = f2.as_mut().poll(cx) {
let $v2 = v;
return core::task::Poll::Ready($b2);
}
if let core::task::Poll::Ready(v) = f3.as_mut().poll(cx) {
let $v3 = v;
return core::task::Poll::Ready($b3);
}
core::task::Poll::Pending
})
.await
}};
($v1:pat = $f1:expr => $b1:expr, $v2:pat = $f2:expr => $b2:expr, $v3:pat = $f3:expr => $b3:expr, ; default { $default:expr }) => {{
let mut f1 = core::pin::pin!($f1);
let mut f2 = core::pin::pin!($f2);
let mut f3 = core::pin::pin!($f3);
::futures_lite::future::poll_fn(|cx| {
if let core::task::Poll::Ready(v) = f1.as_mut().poll(cx) {
let $v1 = v;
return core::task::Poll::Ready($b1);
}
if let core::task::Poll::Ready(v) = f2.as_mut().poll(cx) {
let $v2 = v;
return core::task::Poll::Ready($b2);
}
if let core::task::Poll::Ready(v) = f3.as_mut().poll(cx) {
let $v3 = v;
return core::task::Poll::Ready($b3);
}
core::task::Poll::Ready($default)
})
.await
}};
}