1 //! The trait [`IntoEither`] provides methods for converting a type `Self`, whose
2 //! size is constant and known at compile-time, into an [`Either`] variant.
3 
4 use super::{Either, Left, Right};
5 
6 /// Provides methods for converting a type `Self` into either a [`Left`] or [`Right`]
7 /// variant of [`Either<Self, Self>`](Either).
8 ///
9 /// The [`into_either`](IntoEither::into_either) method takes a [`bool`] to determine
10 /// whether to convert to [`Left`] or [`Right`].
11 ///
12 /// The [`into_either_with`](IntoEither::into_either_with) method takes a
13 /// [predicate function](FnOnce) to determine whether to convert to [`Left`] or [`Right`].
14 pub trait IntoEither: Sized {
15     /// Converts `self` into a [`Left`] variant of [`Either<Self, Self>`](Either)
16     /// if `into_left` is `true`.
17     /// Converts `self` into a [`Right`] variant of [`Either<Self, Self>`](Either)
18     /// otherwise.
19     ///
20     /// # Examples
21     ///
22     /// ```
23     /// use either::{IntoEither, Left, Right};
24     ///
25     /// let x = 0;
26     /// assert_eq!(x.into_either(true), Left(x));
27     /// assert_eq!(x.into_either(false), Right(x));
28     /// ```
into_either(self, into_left: bool) -> Either<Self, Self>29     fn into_either(self, into_left: bool) -> Either<Self, Self> {
30         if into_left {
31             Left(self)
32         } else {
33             Right(self)
34         }
35     }
36 
37     /// Converts `self` into a [`Left`] variant of [`Either<Self, Self>`](Either)
38     /// if `into_left(&self)` returns `true`.
39     /// Converts `self` into a [`Right`] variant of [`Either<Self, Self>`](Either)
40     /// otherwise.
41     ///
42     /// # Examples
43     ///
44     /// ```
45     /// use either::{IntoEither, Left, Right};
46     ///
47     /// fn is_even(x: &u8) -> bool {
48     ///     x % 2 == 0
49     /// }
50     ///
51     /// let x = 0;
52     /// assert_eq!(x.into_either_with(is_even), Left(x));
53     /// assert_eq!(x.into_either_with(|x| !is_even(x)), Right(x));
54     /// ```
into_either_with<F>(self, into_left: F) -> Either<Self, Self> where F: FnOnce(&Self) -> bool,55     fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
56     where
57         F: FnOnce(&Self) -> bool,
58     {
59         let into_left = into_left(&self);
60         self.into_either(into_left)
61     }
62 }
63 
64 impl<T> IntoEither for T {}
65