pub trait OptionTranspose<T> {
fn transpose(self) -> Option<Option<T>>;
}
impl<T> OptionTranspose<T> for Option<Option<T>> {
fn transpose(self) -> Option<Option<T>> {
match self {
Some(Some(x)) => Some(Some(x)),
Some(None) => None,
_ => Some(None),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_transpose() {
let x: Option<Option<i32>> = Some(Some(1));
assert_eq!(x.transpose(), Some(Some(1)));
let x: Option<Option<i32>> = Some(None);
assert_eq!(x.transpose(), None);
let x: Option<Option<i32>> = None;
assert_eq!(x.transpose(), Some(None));
}
}