ostd/util/
either.rs

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