Struct TableParIterator
pub struct TableParIterator<'a, T> {
pub table: &'a MetadataTable<'a, T>,
pub range: Range<u32>,
}Expand description
Parallel iterator for metadata table rows.
This iterator enables concurrent processing of table rows across multiple threads using the Rayon parallel processing framework. It automatically distributes work and handles synchronization, providing significant performance improvements for CPU-intensive operations on large tables.
§Features
- Automatic parallelization: Work is distributed across available CPU cores
- Load balancing: Dynamic work stealing ensures optimal CPU utilization
- Error handling: Built-in support for early termination on errors
- Type safety: Compile-time guarantees about thread safety requirements
§Requirements
The row type T must implement Send + Sync to enable safe parallel processing.
This ensures that rows can be safely transferred between threads and accessed
concurrently.
§Usage
Created through MetadataTable::par_iter() and supports all Rayon parallel
iterator operations
Fields§
§table: &'a MetadataTable<'a, T>Reference to the table being iterated
range: Range<u32>Range of row indices to process
Implementations§
§impl<'a, T: RowReadable + Send + Sync + 'a> TableParIterator<'a, T>
impl<'a, T: RowReadable + Send + Sync + 'a> TableParIterator<'a, T>
pub fn try_for_each<F>(self, op: F) -> Result<()>
pub fn try_for_each<F>(self, op: F) -> Result<()>
Processes the iterator in parallel with early error detection and termination.
This method provides a parallel equivalent to the standard iterator’s try_for_each,
executing the provided operation on each row concurrently while monitoring for
errors. If any operation fails, processing stops and the first error encountered
is returned.
§Arguments
op- A closure that takes each row and returns aResult. Must beSend + Syncto enable safe parallel execution.
§Returns
Returns Ok(()) if all operations complete successfully, or the first error
encountered during parallel processing.
§Panics
This function will panic if the mutex is poisoned during error handling.
§Errors
Returns an error if any operation applied to an item returns an error. The first error encountered is returned.
Trait Implementations§
§impl<T: RowReadable + Send + Sync> IndexedParallelIterator for TableParIterator<'_, T>
impl<T: RowReadable + Send + Sync> IndexedParallelIterator for TableParIterator<'_, T>
§fn len(&self) -> usize
fn len(&self) -> usize
§fn drive<C>(self, consumer: C) -> C::Result
fn drive<C>(self, consumer: C) -> C::Result
§fn with_producer<CB>(self, callback: CB) -> CB::Outputwhere
CB: ProducerCallback<Self::Item>,
fn with_producer<CB>(self, callback: CB) -> CB::Outputwhere
CB: ProducerCallback<Self::Item>,
Source§fn by_exponential_blocks(self) -> ExponentialBlocks<Self>
fn by_exponential_blocks(self) -> ExponentialBlocks<Self>
Source§fn by_uniform_blocks(self, block_size: usize) -> UniformBlocks<Self>
fn by_uniform_blocks(self, block_size: usize) -> UniformBlocks<Self>
Source§fn collect_into_vec(self, target: &mut Vec<Self::Item>)
fn collect_into_vec(self, target: &mut Vec<Self::Item>)
Source§fn unzip_into_vecs<A, B>(self, left: &mut Vec<A>, right: &mut Vec<B>)
fn unzip_into_vecs<A, B>(self, left: &mut Vec<A>, right: &mut Vec<B>)
Source§fn zip<Z>(self, zip_op: Z) -> Zip<Self, <Z as IntoParallelIterator>::Iter>
fn zip<Z>(self, zip_op: Z) -> Zip<Self, <Z as IntoParallelIterator>::Iter>
(A, B), where the items A are from
this iterator and B are from the iterator given as argument.
Like the zip method on ordinary iterators, if the two
iterators are of unequal length, you only get the items they
have in common. Read moreSource§fn zip_eq<Z>(self, zip_op: Z) -> ZipEq<Self, <Z as IntoParallelIterator>::Iter>
fn zip_eq<Z>(self, zip_op: Z) -> ZipEq<Self, <Z as IntoParallelIterator>::Iter>
Zip, but requires that both iterators have the same length. Read moreSource§fn interleave<I>(
self,
other: I,
) -> Interleave<Self, <I as IntoParallelIterator>::Iter>where
I: IntoParallelIterator<Item = Self::Item>,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
fn interleave<I>(
self,
other: I,
) -> Interleave<Self, <I as IntoParallelIterator>::Iter>where
I: IntoParallelIterator<Item = Self::Item>,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Source§fn interleave_shortest<I>(
self,
other: I,
) -> InterleaveShortest<Self, <I as IntoParallelIterator>::Iter>where
I: IntoParallelIterator<Item = Self::Item>,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
fn interleave_shortest<I>(
self,
other: I,
) -> InterleaveShortest<Self, <I as IntoParallelIterator>::Iter>where
I: IntoParallelIterator<Item = Self::Item>,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Source§fn chunks(self, chunk_size: usize) -> Chunks<Self>
fn chunks(self, chunk_size: usize) -> Chunks<Self>
Source§fn fold_chunks<T, ID, F>(
self,
chunk_size: usize,
identity: ID,
fold_op: F,
) -> FoldChunks<Self, ID, F>
fn fold_chunks<T, ID, F>( self, chunk_size: usize, identity: ID, fold_op: F, ) -> FoldChunks<Self, ID, F>
Source§fn fold_chunks_with<T, F>(
self,
chunk_size: usize,
init: T,
fold_op: F,
) -> FoldChunksWith<Self, T, F>
fn fold_chunks_with<T, F>( self, chunk_size: usize, init: T, fold_op: F, ) -> FoldChunksWith<Self, T, F>
Source§fn cmp<I>(self, other: I) -> Orderingwhere
I: IntoParallelIterator<Item = Self::Item>,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: Ord,
fn cmp<I>(self, other: I) -> Orderingwhere
I: IntoParallelIterator<Item = Self::Item>,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: Ord,
ParallelIterator with those of
another. Read moreSource§fn partial_cmp<I>(self, other: I) -> Option<Ordering>where
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
fn partial_cmp<I>(self, other: I) -> Option<Ordering>where
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
ParallelIterator with those of
another. Read moreSource§fn eq<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialEq<<I as IntoParallelIterator>::Item>,
fn eq<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialEq<<I as IntoParallelIterator>::Item>,
ParallelIterator
are equal to those of anotherSource§fn ne<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialEq<<I as IntoParallelIterator>::Item>,
fn ne<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialEq<<I as IntoParallelIterator>::Item>,
ParallelIterator
are unequal to those of anotherSource§fn lt<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
fn lt<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
ParallelIterator
are lexicographically less than those of another.Source§fn le<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
fn le<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
ParallelIterator
are less than or equal to those of another.Source§fn gt<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
fn gt<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
ParallelIterator
are lexicographically greater than those of another.Source§fn ge<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
fn ge<I>(self, other: I) -> boolwhere
I: IntoParallelIterator,
<I as IntoParallelIterator>::Iter: IndexedParallelIterator,
Self::Item: PartialOrd<<I as IntoParallelIterator>::Item>,
ParallelIterator
are greater than or equal to those of another.Source§fn step_by(self, step: usize) -> StepBy<Self>
fn step_by(self, step: usize) -> StepBy<Self>
Source§fn skip(self, n: usize) -> Skip<Self>
fn skip(self, n: usize) -> Skip<Self>
n elements. Read moreSource§fn take(self, n: usize) -> Take<Self>
fn take(self, n: usize) -> Take<Self>
n elements. Read moreSource§fn position_any<P>(self, predicate: P) -> Option<usize>
fn position_any<P>(self, predicate: P) -> Option<usize>
ParallelIterator::find_any, the parallel search will not
necessarily find the first match, and once a match is
found we’ll attempt to stop processing any more. Read moreSource§fn position_first<P>(self, predicate: P) -> Option<usize>
fn position_first<P>(self, predicate: P) -> Option<usize>
Source§fn position_last<P>(self, predicate: P) -> Option<usize>
fn position_last<P>(self, predicate: P) -> Option<usize>
Source§fn positions<P>(self, predicate: P) -> Positions<Self, P>
fn positions<P>(self, predicate: P) -> Positions<Self, P>
Source§fn rev(self) -> Rev<Self>
fn rev(self) -> Rev<Self>
Source§fn with_min_len(self, min: usize) -> MinLen<Self>
fn with_min_len(self, min: usize) -> MinLen<Self>
Source§fn with_max_len(self, max: usize) -> MaxLen<Self>
fn with_max_len(self, max: usize) -> MaxLen<Self>
with_min_len().
For example, given min=10 and max=15, a length of 16 will not be
split any further. Read more§impl<T: RowReadable + Send + Sync> ParallelIterator for TableParIterator<'_, T>
impl<T: RowReadable + Send + Sync> ParallelIterator for TableParIterator<'_, T>
§type Item = T
type Item = T
for_each method, this is the type of
item that your closure will be invoked with.§fn drive_unindexed<C>(self, consumer: C) -> C::Resultwhere
C: UnindexedConsumer<Self::Item>,
fn drive_unindexed<C>(self, consumer: C) -> C::Resultwhere
C: UnindexedConsumer<Self::Item>,
Source§fn for_each<OP>(self, op: OP)
fn for_each<OP>(self, op: OP)
OP on each item produced by the iterator, in parallel. Read moreSource§fn for_each_with<OP, T>(self, init: T, op: OP)
fn for_each_with<OP, T>(self, init: T, op: OP)
Source§fn for_each_init<OP, INIT, T>(self, init: INIT, op: OP)
fn for_each_init<OP, INIT, T>(self, init: INIT, op: OP)
OP on a value returned by init with each item produced by
the iterator, in parallel. Read moreSource§fn try_for_each<OP, R>(self, op: OP) -> R
fn try_for_each<OP, R>(self, op: OP) -> R
OP on each item produced by the iterator, in parallel. Read moreSource§fn try_for_each_with<OP, T, R>(self, init: T, op: OP) -> R
fn try_for_each_with<OP, T, R>(self, init: T, op: OP) -> R
OP on the given init value with each item
produced by the iterator, in parallel. Read moreSource§fn try_for_each_init<OP, INIT, T, R>(self, init: INIT, op: OP) -> R
fn try_for_each_init<OP, INIT, T, R>(self, init: INIT, op: OP) -> R
OP on a value returned by init with each item
produced by the iterator, in parallel. Read moreSource§fn map<F, R>(self, map_op: F) -> Map<Self, F>
fn map<F, R>(self, map_op: F) -> Map<Self, F>
map_op to each item of this iterator, producing a new
iterator with the results. Read moreSource§fn map_with<F, T, R>(self, init: T, map_op: F) -> MapWith<Self, T, F>
fn map_with<F, T, R>(self, init: T, map_op: F) -> MapWith<Self, T, F>
map_op to the given init value with each item of this
iterator, producing a new iterator with the results. Read moreSource§fn map_init<F, INIT, T, R>(
self,
init: INIT,
map_op: F,
) -> MapInit<Self, INIT, F>
fn map_init<F, INIT, T, R>( self, init: INIT, map_op: F, ) -> MapInit<Self, INIT, F>
map_op to a value returned by init with each item of this
iterator, producing a new iterator with the results. Read moreSource§fn inspect<OP>(self, inspect_op: OP) -> Inspect<Self, OP>
fn inspect<OP>(self, inspect_op: OP) -> Inspect<Self, OP>
inspect_op to a reference to each item of this iterator,
producing a new iterator passing through the original items. This is
often useful for debugging to see what’s happening in iterator stages. Read moreSource§fn update<F>(self, update_op: F) -> Update<Self, F>
fn update<F>(self, update_op: F) -> Update<Self, F>
Source§fn filter<P>(self, filter_op: P) -> Filter<Self, P>
fn filter<P>(self, filter_op: P) -> Filter<Self, P>
filter_op to each item of this iterator, producing a new
iterator with only the items that gave true results. Read moreSource§fn filter_map<P, R>(self, filter_op: P) -> FilterMap<Self, P>
fn filter_map<P, R>(self, filter_op: P) -> FilterMap<Self, P>
filter_op to each item of this iterator to get an Option,
producing a new iterator with only the items from Some results. Read moreSource§fn flat_map<F, PI>(self, map_op: F) -> FlatMap<Self, F>
fn flat_map<F, PI>(self, map_op: F) -> FlatMap<Self, F>
map_op to each item of this iterator to get nested parallel iterators,
producing a new parallel iterator that flattens these back into one. Read moreSource§fn flat_map_iter<F, SI>(self, map_op: F) -> FlatMapIter<Self, F>
fn flat_map_iter<F, SI>(self, map_op: F) -> FlatMapIter<Self, F>
map_op to each item of this iterator to get nested serial iterators,
producing a new parallel iterator that flattens these back into one. Read moreSource§fn flatten(self) -> Flatten<Self>where
Self::Item: IntoParallelIterator,
fn flatten(self) -> Flatten<Self>where
Self::Item: IntoParallelIterator,
Items into one large iterator. Read moreSource§fn flatten_iter(self) -> FlattenIter<Self>
fn flatten_iter(self) -> FlattenIter<Self>
Items into one large iterator. Read moreSource§fn reduce<OP, ID>(self, identity: ID, op: OP) -> Self::Item
fn reduce<OP, ID>(self, identity: ID, op: OP) -> Self::Item
op.
The argument identity should be a closure that can produce
“identity” value which may be inserted into the sequence as
needed to create opportunities for parallel execution. So, for
example, if you are doing a summation, then identity() ought
to produce something that represents the zero for your type
(but consider just calling sum() in that case). Read moreSource§fn reduce_with<OP>(self, op: OP) -> Option<Self::Item>
fn reduce_with<OP>(self, op: OP) -> Option<Self::Item>
op.
If the iterator is empty, None is returned; otherwise,
Some is returned. Read moreSource§fn try_reduce<T, OP, ID>(self, identity: ID, op: OP) -> Self::Item
fn try_reduce<T, OP, ID>(self, identity: ID, op: OP) -> Self::Item
Source§fn try_reduce_with<T, OP>(self, op: OP) -> Option<Self::Item>
fn try_reduce_with<T, OP>(self, op: OP) -> Option<Self::Item>
op. Read moreSource§fn fold<T, ID, F>(self, identity: ID, fold_op: F) -> Fold<Self, ID, F>
fn fold<T, ID, F>(self, identity: ID, fold_op: F) -> Fold<Self, ID, F>
22 3 77 89 46. If
you used sequential fold to add them (fold(0, |a,b| a+b),
you would wind up first adding 0 + 22, then 22 + 3, then 25 +
77, and so forth. The parallel fold works similarly except
that it first breaks up your list into sublists, and hence
instead of yielding up a single sum at the end, it yields up
multiple sums. The number of results is nondeterministic, as
is the point where the breaks occur. Read moreSource§fn fold_with<F, T>(self, init: T, fold_op: F) -> FoldWith<Self, T, F>
fn fold_with<F, T>(self, init: T, fold_op: F) -> FoldWith<Self, T, F>
fold_op to the given init value with each item of this
iterator, finally producing the value for further use. Read moreSource§fn try_fold<T, R, ID, F>(
self,
identity: ID,
fold_op: F,
) -> TryFold<Self, R, ID, F>
fn try_fold<T, R, ID, F>( self, identity: ID, fold_op: F, ) -> TryFold<Self, R, ID, F>
Source§fn try_fold_with<F, T, R>(self, init: T, fold_op: F) -> TryFoldWith<Self, R, F>
fn try_fold_with<F, T, R>(self, init: T, fold_op: F) -> TryFoldWith<Self, R, F>
init value. Read moreSource§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
None is returned; otherwise, Some(min)
is returned. Read moreSource§fn min_by<F>(self, f: F) -> Option<Self::Item>
fn min_by<F>(self, f: F) -> Option<Self::Item>
None is
returned; otherwise, Some(min) is returned. Read moreSource§fn min_by_key<K, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<K, F>(self, f: F) -> Option<Self::Item>
None is returned;
otherwise, Some(item) is returned. Read moreSource§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
None is returned; otherwise, Some(max)
is returned. Read moreSource§fn max_by<F>(self, f: F) -> Option<Self::Item>
fn max_by<F>(self, f: F) -> Option<Self::Item>
None is
returned; otherwise, Some(max) is returned. Read moreSource§fn max_by_key<K, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<K, F>(self, f: F) -> Option<Self::Item>
None is returned;
otherwise, Some(item) is returned. Read moreSource§fn chain<C>(self, chain: C) -> Chain<Self, <C as IntoParallelIterator>::Iter>where
C: IntoParallelIterator<Item = Self::Item>,
fn chain<C>(self, chain: C) -> Chain<Self, <C as IntoParallelIterator>::Iter>where
C: IntoParallelIterator<Item = Self::Item>,
Source§fn find_any<P>(self, predicate: P) -> Option<Self::Item>
fn find_any<P>(self, predicate: P) -> Option<Self::Item>
find on sequential iterators but
the item returned may not be the first one in the parallel
sequence which matches, since we search the entire sequence in parallel. Read moreSource§fn find_first<P>(self, predicate: P) -> Option<Self::Item>
fn find_first<P>(self, predicate: P) -> Option<Self::Item>
Source§fn find_last<P>(self, predicate: P) -> Option<Self::Item>
fn find_last<P>(self, predicate: P) -> Option<Self::Item>
Source§fn find_map_any<P, R>(self, predicate: P) -> Option<R>
fn find_map_any<P, R>(self, predicate: P) -> Option<R>
Source§fn find_map_first<P, R>(self, predicate: P) -> Option<R>
fn find_map_first<P, R>(self, predicate: P) -> Option<R>
Source§fn find_map_last<P, R>(self, predicate: P) -> Option<R>
fn find_map_last<P, R>(self, predicate: P) -> Option<R>
Source§fn any<P>(self, predicate: P) -> bool
fn any<P>(self, predicate: P) -> bool
Source§fn all<P>(self, predicate: P) -> bool
fn all<P>(self, predicate: P) -> bool
Source§fn while_some<T>(self) -> WhileSome<Self>
fn while_some<T>(self) -> WhileSome<Self>
Some items of this iterator, halting
as soon as any None is found. Read moreSource§fn panic_fuse(self) -> PanicFuse<Self>
fn panic_fuse(self) -> PanicFuse<Self>
Source§fn collect<C>(self) -> Cwhere
C: FromParallelIterator<Self::Item>,
fn collect<C>(self) -> Cwhere
C: FromParallelIterator<Self::Item>,
Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)where
Self: ParallelIterator<Item = (A, B)>,
FromA: Default + Send + ParallelExtend<A>,
FromB: Default + Send + ParallelExtend<B>,
A: Send,
B: Send,
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)where
Self: ParallelIterator<Item = (A, B)>,
FromA: Default + Send + ParallelExtend<A>,
FromB: Default + Send + ParallelExtend<B>,
A: Send,
B: Send,
ParallelExtend containers. Read moreSource§fn partition<A, B, P>(self, predicate: P) -> (A, B)
fn partition<A, B, P>(self, predicate: P) -> (A, B)
ParallelExtend containers. Items for which the predicate returns
true go into the first container, and the rest go into the second. Read moreSource§fn partition_map<A, B, P, L, R>(self, predicate: P) -> (A, B)
fn partition_map<A, B, P, L, R>(self, predicate: P) -> (A, B)
ParallelExtend containers. Either::Left items go into
the first container, and Either::Right items go into the second. Read moreSource§fn intersperse(self, element: Self::Item) -> Intersperse<Self>
fn intersperse(self, element: Self::Item) -> Intersperse<Self>
Source§fn take_any(self, n: usize) -> TakeAny<Self>
fn take_any(self, n: usize) -> TakeAny<Self>
n elements from anywhere in the original iterator. Read moreSource§fn skip_any(self, n: usize) -> SkipAny<Self>
fn skip_any(self, n: usize) -> SkipAny<Self>
n elements from anywhere in the original iterator. Read moreSource§fn take_any_while<P>(self, predicate: P) -> TakeAnyWhile<Self, P>
fn take_any_while<P>(self, predicate: P) -> TakeAnyWhile<Self, P>
predicate returns false. Read moreSource§fn skip_any_while<P>(self, predicate: P) -> SkipAnyWhile<Self, P>
fn skip_any_while<P>(self, predicate: P) -> SkipAnyWhile<Self, P>
predicate returns false. Read moreSource§fn collect_vec_list(self) -> LinkedList<Vec<Self::Item>>
fn collect_vec_list(self) -> LinkedList<Vec<Self::Item>>
Auto Trait Implementations§
impl<'a, T> Freeze for TableParIterator<'a, T>
impl<'a, T> RefUnwindSafe for TableParIterator<'a, T>where
T: RefUnwindSafe,
impl<'a, T> Send for TableParIterator<'a, T>
impl<'a, T> Sync for TableParIterator<'a, T>
impl<'a, T> Unpin for TableParIterator<'a, T>
impl<'a, T> UnwindSafe for TableParIterator<'a, T>where
T: RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more