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}