ostd/util/either.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
// SPDX-License-Identifier: MPL-2.0
/// A type containing either a [`Left`] value `L` or a [`Right`] value `R`.
///
/// [`Left`]: Self::Left
/// [`Right`]: Self::Right
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Either<L, R> {
/// Contains the left value
Left(L),
/// Contains the right value
Right(R),
}
impl<L, R> Either<L, R> {
/// Converts to the left value, if any.
pub fn left(self) -> Option<L> {
match self {
Self::Left(left) => Some(left),
Self::Right(_) => None,
}
}
/// Converts to the right value, if any.
pub fn right(self) -> Option<R> {
match self {
Self::Left(_) => None,
Self::Right(right) => Some(right),
}
}
/// Returns true if the left value is present.
pub fn is_left(&self) -> bool {
matches!(self, Self::Left(_))
}
/// Returns true if the right value is present.
pub fn is_right(&self) -> bool {
matches!(self, Self::Right(_))
}
// TODO: Add other utility methods (e.g. `as_ref`, `as_mut`) as needed.
// As a good reference, check what methods `Result` provides.
}