Enum EitherOrBoth

Source
pub enum EitherOrBoth<A, B> {
    Both(A, B),
    Left(A),
    Right(B),
}
Expand description

Value that either holds a single A or B, or both.

Variants§

§

Both(A, B)

Both values are present.

§

Left(A)

Only the left value of type A is present.

§

Right(B)

Only the right value of type B is present.

Implementations§

Source§

impl<A, B> EitherOrBoth<A, B>

Source

pub fn has_left(&self) -> bool

If Left, or Both, return true. Otherwise, return false.

Source

pub fn has_right(&self) -> bool

If Right, or Both, return true, otherwise, return false.

Source

pub fn is_left(&self) -> bool

If Left, return true. Otherwise, return false. Exclusive version of has_left.

Source

pub fn is_right(&self) -> bool

If Right, return true. Otherwise, return false. Exclusive version of has_right.

Source

pub fn is_both(&self) -> bool

If Both, return true. Otherwise, return false.

Source

pub fn left(self) -> Option<A>

If Left, or Both, return Some with the left value. Otherwise, return None.

Source

pub fn right(self) -> Option<B>

If Right, or Both, return Some with the right value. Otherwise, return None.

Source

pub fn just_left(self) -> Option<A>

If Left, return Some with the left value. If Right or Both, return None.

§Examples
// On the `Left` variant.
let x: EitherOrBoth<_, ()> = Left("bonjour");
assert_eq!(x.just_left(), Some("bonjour"));

// On the `Right` variant.
let x: EitherOrBoth<(), _> = Right("hola");
assert_eq!(x.just_left(), None);

// On the `Both` variant.
let x = Both("bonjour", "hola");
assert_eq!(x.just_left(), None);
Source

pub fn just_right(self) -> Option<B>

If Right, return Some with the right value. If Left or Both, return None.

§Examples
// On the `Left` variant.
let x: EitherOrBoth<_, ()> = Left("auf wiedersehen");
assert_eq!(x.just_left(), Some("auf wiedersehen"));

// On the `Right` variant.
let x: EitherOrBoth<(), _> = Right("adios");
assert_eq!(x.just_left(), None);

// On the `Both` variant.
let x = Both("auf wiedersehen", "adios");
assert_eq!(x.just_left(), None);
Source

pub fn both(self) -> Option<(A, B)>

If Both, return Some containing the left and right values. Otherwise, return None.

Source

pub fn into_left(self) -> A
where B: Into<A>,

If Left or Both, return the left value. Otherwise, convert the right value and return it.

Source

pub fn into_right(self) -> B
where A: Into<B>,

If Right or Both, return the right value. Otherwise, convert the left value and return it.

Source

pub fn as_ref(&self) -> EitherOrBoth<&A, &B>

Converts from &EitherOrBoth<A, B> to EitherOrBoth<&A, &B>.

Source

pub fn as_mut(&mut self) -> EitherOrBoth<&mut A, &mut B>

Converts from &mut EitherOrBoth<A, B> to EitherOrBoth<&mut A, &mut B>.

Source

pub fn as_deref( &self, ) -> EitherOrBoth<&<A as Deref>::Target, &<B as Deref>::Target>
where A: Deref, B: Deref,

Converts from &EitherOrBoth<A, B> to EitherOrBoth<&_, &_> using the Deref trait.

Source

pub fn as_deref_mut( &mut self, ) -> EitherOrBoth<&mut <A as Deref>::Target, &mut <B as Deref>::Target>
where A: DerefMut, B: DerefMut,

Converts from &mut EitherOrBoth<A, B> to EitherOrBoth<&mut _, &mut _> using the DerefMut trait.

Source

pub fn flip(self) -> EitherOrBoth<B, A>

Convert EitherOrBoth<A, B> to EitherOrBoth<B, A>.

Source

pub fn map_left<F, M>(self, f: F) -> EitherOrBoth<M, B>
where F: FnOnce(A) -> M,

Apply the function f on the value a in Left(a) or Both(a, b) variants. If it is present rewrapping the result in self’s original variant.

Source

pub fn map_right<F, M>(self, f: F) -> EitherOrBoth<A, M>
where F: FnOnce(B) -> M,

Apply the function f on the value b in Right(b) or Both(a, b) variants. If it is present rewrapping the result in self’s original variant.

Source

pub fn map_any<F, L, G, R>(self, f: F, g: G) -> EitherOrBoth<L, R>
where F: FnOnce(A) -> L, G: FnOnce(B) -> R,

Apply the functions f and g on the value a and b respectively; found in Left(a), Right(b), or Both(a, b) variants. The Result is rewrapped self’s original variant.

Source

pub fn left_and_then<F, L>(self, f: F) -> EitherOrBoth<L, B>
where F: FnOnce(A) -> EitherOrBoth<L, B>,

Apply the function f on the value a in Left(a) or Both(a, _) variants if it is present.

Source

pub fn right_and_then<F, R>(self, f: F) -> EitherOrBoth<A, R>
where F: FnOnce(B) -> EitherOrBoth<A, R>,

Apply the function f on the value b in Right(b) or Both(_, b) variants if it is present.

Source

pub fn or(self, l: A, r: B) -> (A, B)

Returns a tuple consisting of the l and r in Both(l, r), if present. Otherwise, returns the wrapped value for the present element, and the supplied value for the other. The first (l) argument is used for a missing Left value. The second (r) argument is used for a missing Right value.

Arguments passed to or are eagerly evaluated; if you are passing the result of a function call, it is recommended to use or_else, which is lazily evaluated.

§Examples
assert_eq!(EitherOrBoth::Both("tree", 1).or("stone", 5), ("tree", 1));
assert_eq!(EitherOrBoth::Left("tree").or("stone", 5), ("tree", 5));
assert_eq!(EitherOrBoth::Right(1).or("stone", 5), ("stone", 1));
Source

pub fn or_default(self) -> (A, B)
where A: Default, B: Default,

Returns a tuple consisting of the l and r in Both(l, r), if present. Otherwise, returns the wrapped value for the present element, and the default for the other.

Source

pub fn or_else<L, R>(self, l: L, r: R) -> (A, B)
where L: FnOnce() -> A, R: FnOnce() -> B,

Returns a tuple consisting of the l and r in Both(l, r), if present. Otherwise, returns the wrapped value for the present element, and computes the missing value with the supplied closure. The first argument (l) is used for a missing Left value. The second argument (r) is used for a missing Right value.

§Examples
let k = 10;
assert_eq!(EitherOrBoth::Both("tree", 1).or_else(|| "stone", || 2 * k), ("tree", 1));
assert_eq!(EitherOrBoth::Left("tree").or_else(|| "stone", || 2 * k), ("tree", 20));
assert_eq!(EitherOrBoth::Right(1).or_else(|| "stone", || 2 * k), ("stone", 1));
Source

pub fn left_or_insert(&mut self, val: A) -> &mut A

Returns a mutable reference to the left value. If the left value is not present, it is replaced with val.

Source

pub fn right_or_insert(&mut self, val: B) -> &mut B

Returns a mutable reference to the right value. If the right value is not present, it is replaced with val.

Source

pub fn left_or_insert_with<F>(&mut self, f: F) -> &mut A
where F: FnOnce() -> A,

If the left value is not present, replace it the value computed by the closure f. Returns a mutable reference to the now-present left value.

Source

pub fn right_or_insert_with<F>(&mut self, f: F) -> &mut B
where F: FnOnce() -> B,

If the right value is not present, replace it the value computed by the closure f. Returns a mutable reference to the now-present right value.

Source

pub fn insert_left(&mut self, val: A) -> &mut A

Sets the left value of this instance, and returns a mutable reference to it. Does not affect the right value.

§Examples

// Overwriting a pre-existing value.
let mut either: EitherOrBoth<_, ()> = Left(0_u32);
assert_eq!(*either.insert_left(69), 69);

// Inserting a second value.
let mut either = Right("no");
assert_eq!(*either.insert_left("yes"), "yes");
assert_eq!(either, Both("yes", "no"));
Source

pub fn insert_right(&mut self, val: B) -> &mut B

Sets the right value of this instance, and returns a mutable reference to it. Does not affect the left value.

§Examples
// Overwriting a pre-existing value.
let mut either: EitherOrBoth<_, ()> = Left(0_u32);
assert_eq!(*either.insert_left(69), 69);

// Inserting a second value.
let mut either = Left("what's");
assert_eq!(*either.insert_right(9 + 10), 21 - 2);
assert_eq!(either, Both("what's", 9+10));
Source

pub fn insert_both(&mut self, left: A, right: B) -> (&mut A, &mut B)

Set self to Both(..), containing the specified left and right values, and returns a mutable reference to those values.

Source§

impl<T> EitherOrBoth<T, T>

Source

pub fn reduce<F>(self, f: F) -> T
where F: FnOnce(T, T) -> T,

Return either value of left, right, or apply a function f to both values if both are present. The input function has to return the same type as both Right and Left carry.

§Examples
assert_eq!(EitherOrBoth::Both(3, 7).reduce(u32::max), 7);
assert_eq!(EitherOrBoth::Left(3).reduce(u32::max), 3);
assert_eq!(EitherOrBoth::Right(7).reduce(u32::max), 7);

Trait Implementations§

Source§

impl<A, B> Clone for EitherOrBoth<A, B>
where A: Clone, B: Clone,

Source§

fn clone(&self) -> EitherOrBoth<A, B>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<A, B> Debug for EitherOrBoth<A, B>
where A: Debug, B: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<A, B> Hash for EitherOrBoth<A, B>
where A: Hash, B: Hash,

Source§

fn hash<__H>(&self, state: &mut __H)
where __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<A, B> Into<Option<Either<A, B>>> for EitherOrBoth<A, B>

Source§

fn into(self) -> Option<Either<A, B>>

Converts this type into the (usually inferred) input type.
Source§

impl<A, B> PartialEq for EitherOrBoth<A, B>
where A: PartialEq, B: PartialEq,

Source§

fn eq(&self, other: &EitherOrBoth<A, B>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<A, B> Eq for EitherOrBoth<A, B>
where A: Eq, B: Eq,

Source§

impl<A, B> StructuralPartialEq for EitherOrBoth<A, B>

Auto Trait Implementations§

§

impl<A, B> Freeze for EitherOrBoth<A, B>
where A: Freeze, B: Freeze,

§

impl<A, B> RefUnwindSafe for EitherOrBoth<A, B>

§

impl<A, B> Send for EitherOrBoth<A, B>
where A: Send, B: Send,

§

impl<A, B> Sync for EitherOrBoth<A, B>
where A: Sync, B: Sync,

§

impl<A, B> Unpin for EitherOrBoth<A, B>
where A: Unpin, B: Unpin,

§

impl<A, B> UnwindSafe for EitherOrBoth<A, B>
where A: UnwindSafe, B: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<S> AssignWithType for S

Source§

fn assign_with_type<T, IntoT>(&mut self, component: IntoT)
where IntoT: Into<T>, S: Assign<T, IntoT>,

Sets the value of a component by its type. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneDyn for T
where T: Clone,

Source§

fn __clone_dyn(&self, _: DontCallMe) -> *mut ()

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<C, E> EntryToVal<C> for E
where C: Collection<Entry = E>,

Source§

type Val = <C as Collection>::Val

The type of values stored in the collection. This might be distinct from Entry in complex collections. For example, in a HashMap, while Entry might be a ( key, value ) tuple, Val might only be the value part.
Source§

fn entry_to_val(self) -> <E as EntryToVal<C>>::Val

Converts an entry into a value representation specific to the type of collection. This conversion is crucial for handling operations on entries, especially when they need to be treated or accessed as individual values, such as retrieving the value part from a key-value pair in a hash map.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoResult<T> for T

Source§

impl<T> IntoResult<T> for T

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<Initial, Error, Final> TransitiveTryFrom<Error, Initial> for Final

Source§

fn transitive_try_from<Transitive>(src: Initial) -> Result<Self, Error>
where Transitive: TryFrom<Initial>, Self: TryFrom<Transitive, Error = Error>, Error: From<<Transitive as TryFrom<Initial>>::Error>,

Performs a transitive try_from conversion. Read more
Source§

impl<Error, Final, Initial> TransitiveTryInto<Error, Final> for Initial

Source§

fn transitive_try_into<Transitive>(self) -> Result<Final, Error>
where Self: TryInto<Transitive>, Transitive: TryInto<Final, Error = Error>, Error: From<Self::Error>,

Performs a transitive try_into conversion. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<C, Val> ValToEntry<C> for Val
where C: CollectionValToEntry<Val>,

Source§

fn val_to_entry(self) -> <C as CollectionValToEntry<Val>>::Entry

Invokes the val_to_entry function of the CollectionValToEntry trait to convert the value to an entry.

Source§

type Entry = <C as CollectionValToEntry<Val>>::Entry

Represents the type of entry that corresponds to the value within the collection.