I’d like to see this implemented as a method on tuple cons cells. Hypothetical syntax follows:
trait TupleOfOptions<T: Tuple>: Tuple {
fn all(self) -> Option<T>;
fn any(self) -> Option<T::Dual>;
}
impl TupleOfOptions<()> for () {
fn all(self) -> Option<()> {
Some(())
}
fn any(self) -> Option<!> {
None
}
}
impl<H, T, U> TupleOfOptions<(H, ...T)> for (Option<H>, ...U)
where T: Tuple,
U: TupleOfOptions<T>
{
fn all(self) -> Option<(H, ...T)> {
let (h_opt, ...u) = self;
match (h_opt, u.all()) {
(Some(h), Some(t)) => Some((h, ...t)),
_ => None,
}
}
fn any(self) -> Option<(H | ...T::Dual)> {
let (h_opt, ...u) = self;
match (h_opt, u.any()) {
(Some(h), _) => Some((h | ...!)),
(None, Some(t)) => Some((! | ...t)),
_ => None,
}
}
}
Then you could use it on a tuple of any number of Options
if let Some((a, b, c)) = (a_opt, b_opt, c_opt).all() {
...
}