pub trait IteratorExt {
Show 16 methods fn parallel_map<F, O>(self, f: F) -> ParallelMap<Self, O>Notable traits for ParallelMap<I, O>impl<I, O> Iterator for ParallelMap<I, O> where
    I: Iterator,
    O: Send,
    <I as Iterator>::Item: Send
type Item = O;

    where
        Self: 'static + Iterator,
        F: 'static + Send + Clone + FnMut(Self::Item) -> O,
        O: 'static + Send,
        Self::Item: 'static,
        Self::Item: Send
, { ... }
fn parallel_map_custom<F, O, OF>(self, of: OF, f: F) -> ParallelMap<Self, O>Notable traits for ParallelMap<I, O>impl<I, O> Iterator for ParallelMap<I, O> where
    I: Iterator,
    O: Send,
    <I as Iterator>::Item: Send
type Item = O;

    where
        Self: 'static + Iterator,
        F: 'static + Send + Clone + FnMut(Self::Item) -> O,
        O: 'static + Send,
        OF: FnOnce(ParallelMapBuilder<Self>) -> ParallelMapBuilder<Self>,
        Self::Item: 'static,
        Self::Item: Send
, { ... }
fn parallel_map_scoped<'env, F, O>(
        self,
        scope: &'scope Scope<'env>,
        f: F
    ) -> ParallelMap<Self, O>Notable traits for ParallelMap<I, O>impl<I, O> Iterator for ParallelMap<I, O> where
    I: Iterator,
    O: Send,
    <I as Iterator>::Item: Send
type Item = O;

    where
        Self: 'env + Iterator,
        F: 'env + Send + Clone + FnMut(Self::Item) -> O,
        O: 'env + Send,
        Self::Item: 'env,
        Self::Item: Send
, { ... }
fn parallel_map_scoped_custom<'env, F, O, OF>(
        self,
        scope: &'scope Scope<'env>,
        of: OF,
        f: F
    ) -> ParallelMap<Self, O>Notable traits for ParallelMap<I, O>impl<I, O> Iterator for ParallelMap<I, O> where
    I: Iterator,
    O: Send,
    <I as Iterator>::Item: Send
type Item = O;

    where
        Self: 'env + Iterator,
        F: 'env + Send + Clone + FnMut(Self::Item) -> O,
        O: 'env + Send,
        OF: FnOnce(ParallelMapBuilder<Self>) -> ParallelMapBuilder<Self>,
        Self::Item: 'env,
        Self::Item: Send
, { ... }
fn parallel_filter<F>(self, f: F) -> ParallelFilter<Self>Notable traits for ParallelFilter<I>impl<I> Iterator for ParallelFilter<I> where
    I: Iterator,
    <I as Iterator>::Item: Send
type Item = <I as Iterator>::Item;

    where
        Self: 'static + Iterator,
        F: 'static + Send + Clone + FnMut(&Self::Item) -> bool,
        Self::Item: 'static,
        Self::Item: Send
, { ... }
fn parallel_filter_custom<F, OF>(self, of: OF, f: F) -> ParallelFilter<Self>Notable traits for ParallelFilter<I>impl<I> Iterator for ParallelFilter<I> where
    I: Iterator,
    <I as Iterator>::Item: Send
type Item = <I as Iterator>::Item;

    where
        Self: 'static + Iterator,
        F: 'static + Send + Clone + FnMut(&Self::Item) -> bool,
        OF: FnOnce(ParallelFilterBuilder<Self>) -> ParallelFilterBuilder<Self>,
        Self::Item: 'static,
        Self::Item: Send
, { ... }
fn parallel_filter_scoped<'env, F>(
        self,
        scope: &'scope Scope<'env>,
        f: F
    ) -> ParallelFilter<Self>Notable traits for ParallelFilter<I>impl<I> Iterator for ParallelFilter<I> where
    I: Iterator,
    <I as Iterator>::Item: Send
type Item = <I as Iterator>::Item;

    where
        Self: 'env + Iterator,
        F: 'env + Send + Clone + FnMut(&Self::Item) -> bool,
        Self::Item: 'env,
        Self::Item: Send
, { ... }
fn parallel_filter_scoped_custom<'env, F, OF>(
        self,
        scope: &'scope Scope<'env>,
        of: OF,
        f: F
    ) -> ParallelFilter<Self>Notable traits for ParallelFilter<I>impl<I> Iterator for ParallelFilter<I> where
    I: Iterator,
    <I as Iterator>::Item: Send
type Item = <I as Iterator>::Item;

    where
        Self: 'env + Iterator,
        F: 'env + Send + Clone + FnMut(&Self::Item) -> bool,
        OF: FnOnce(ParallelFilterBuilder<Self>) -> ParallelFilterBuilder<Self>,
        Self::Item: 'env,
        Self::Item: Send
, { ... }
fn readahead(self) -> Readahead<Self>Notable traits for Readahead<I>impl<I> Iterator for Readahead<I> where
    I: Iterator + Send,
    <I as Iterator>::Item: Send
type Item = <I as Iterator>::Item;

    where
        Self: 'static + Iterator + Send,
        Self::Item: 'static,
        Self::Item: Send
, { ... }
fn readahead_custom<OF>(self, of: OF) -> Readahead<Self>Notable traits for Readahead<I>impl<I> Iterator for Readahead<I> where
    I: Iterator + Send,
    <I as Iterator>::Item: Send
type Item = <I as Iterator>::Item;

    where
        Self: Iterator + 'static + Send,
        OF: FnOnce(ReadaheadBuilder<Self>) -> ReadaheadBuilder<Self>,
        Self::Item: 'static,
        Self::Item: Send
, { ... }
fn readahead_scoped<'env, 'scope>(
        self,
        scope: &'scope Scope<'env>
    ) -> Readahead<Self>Notable traits for Readahead<I>impl<I> Iterator for Readahead<I> where
    I: Iterator + Send,
    <I as Iterator>::Item: Send
type Item = <I as Iterator>::Item;

    where
        Self: Send + 'scope + 'env + Iterator,
        Self::Item: 'env,
        Self::Item: 'scope,
        Self::Item: Send,
        Self::Item: Send
, { ... }
fn readahead_scoped_custom<'env, 'scope, OF>(
        self,
        scope: &'scope Scope<'env>,
        of: OF
    ) -> Readahead<Self>Notable traits for Readahead<I>impl<I> Iterator for Readahead<I> where
    I: Iterator + Send,
    <I as Iterator>::Item: Send
type Item = <I as Iterator>::Item;

    where
        Self: Send + 'scope + 'env + Iterator,
        OF: FnOnce(ReadaheadBuilder<Self>) -> ReadaheadBuilder<Self>,
        Self::Item: 'env,
        Self::Item: 'scope,
        Self::Item: Send,
        Self::Item: Send
, { ... }
fn profile_egress<P>(self, profiler: P) -> ProfileEgress<Self, P>Notable traits for ProfileEgress<I, P>impl<I, P> Iterator for ProfileEgress<I, P> where
    I: Iterator,
    P: Profiler
type Item = <I as Iterator>::Item;

    where
        P: Profiler,
        Self: Iterator
, { ... }
fn profile_ingress<P>(self, profiler: P) -> ProfileIngress<Self, P>Notable traits for ProfileIngress<I, P>impl<I, P> Iterator for ProfileIngress<I, P> where
    I: Iterator,
    P: Profiler
type Item = <I as Iterator>::Item;

    where
        P: Profiler,
        Self: Iterator
, { ... }
fn readahead_profiled<TxP, RxP>(
        self,
        tx_profiler: TxP,
        rx_profiler: RxP
    ) -> ProfileIngress<Readahead<ProfileEgress<Self, TxP>>, RxP>Notable traits for ProfileIngress<I, P>impl<I, P> Iterator for ProfileIngress<I, P> where
    I: Iterator,
    P: Profiler
type Item = <I as Iterator>::Item;

    where
        TxP: Profiler + 'static + Send,
        RxP: Profiler,
        Self: Iterator + 'static + Send,
        Self::Item: 'static,
        Self::Item: Send
, { ... }
fn readahead_scoped_profiled<'env, 'scope, TxP, RxP>(
        self,
        scope: &'scope Scope<'env>,
        tx_profiler: TxP,
        rx_profiler: RxP
    ) -> ProfileIngress<Readahead<ProfileEgress<Self, TxP>>, RxP>Notable traits for ProfileIngress<I, P>impl<I, P> Iterator for ProfileIngress<I, P> where
    I: Iterator,
    P: Profiler
type Item = <I as Iterator>::Item;

    where
        TxP: Profiler + 'static + Send,
        RxP: Profiler,
        Self: Send + 'scope + 'env + Iterator,
        Self::Item: 'env,
        Self::Item: 'scope,
        Self::Item: Send,
        Self::Item: Send
, { ... }
}
Expand description

Extension trait for std::iter::Iterator bringing parallel operations

TODO

  • parallel_for_each
  • parallel_flat_map
  • possibly others

PRs welcome

Provided methods

Run map function in parallel on multiple threads

Results will be returned in order.

No items will be pulled until first time ParallelMap is pulled for elements with ParallelMap::next. In that respect, ParallelMap behaves like every other iterator and is lazy.

A version of [parallel_map] supporting iterating over borrowed values.

See IteratorExt::parallel_map

Run filter function in parallel on multiple threads

A wrapper around IteratorExt::parallel_map really, so it has similiar properties.

Run the current iterator in another thread and return elements through a buffered channel.

buffer_size defines the size of the output channel connecting current and the inner thread. It’s a common mistake to use large channel sizes needlessly in hopes of achieving higher performance. The only benefit large buffer size value provides is smooting out the variance of the inner iterator returning items. The cost - wasting memory. In normal circumstances 0 is recommended (the default).

Scoped version of IteratorExt::readahead

Use when you want to process in parallel items that contain borrowed references.

See scope.

Profile the time it takes downstream iterator step to consume the returned items.

See ProfileEgress and profile::Profiler.

Profile the time it takes upstream iterator step to produce the returned items.

See ProfileIngress and profile::Profiler.

Profiled version of IteratorExt::readahead

Literally .profile_egress(tx_profiler).readahead(n).profile_ingress(rx_profiler)

See Profiler for more info.

Profiled version of IteratorExt::readahead_scoped

Literally .profile_egress(tx_profiler).readahead_scoped(scope, n).profile_ingress(rx_profiler)

See Profiler for more info.

Implementors