diff options
author | Joel Galenson <jgalenson@google.com> | 2021-05-19 16:31:56 -0700 |
---|---|---|
committer | Joel Galenson <jgalenson@google.com> | 2021-05-19 16:31:56 -0700 |
commit | dd2305def6fff1d9f1149ecb73b02e37eb8a18b0 (patch) | |
tree | a915bf2398b238dbd70ae338a6bb643a7372de84 /src/iter/unzip.rs | |
parent | 698313e1f73ce48237108f63ba85b3000f9d0ff1 (diff) | |
download | rayon-dd2305def6fff1d9f1149ecb73b02e37eb8a18b0.tar.gz |
Upgrade rust/crates/rayon to 1.5.1
Test: make
Change-Id: I40c1a4538832871d1f4cd09daf6904d094b5615e
Diffstat (limited to 'src/iter/unzip.rs')
-rw-r--r-- | src/iter/unzip.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/iter/unzip.rs b/src/iter/unzip.rs index 219b909..0b7074e 100644 --- a/src/iter/unzip.rs +++ b/src/iter/unzip.rs @@ -462,3 +462,64 @@ where } } } + +impl<A, B, FromA, FromB> FromParallelIterator<(A, B)> for (FromA, FromB) +where + A: Send, + B: Send, + FromA: Send + FromParallelIterator<A>, + FromB: Send + FromParallelIterator<B>, +{ + fn from_par_iter<I>(pi: I) -> Self + where + I: IntoParallelIterator<Item = (A, B)>, + { + let (a, b): (Collector<FromA>, Collector<FromB>) = pi.into_par_iter().unzip(); + (a.result.unwrap(), b.result.unwrap()) + } +} + +impl<L, R, A, B> FromParallelIterator<Either<L, R>> for (A, B) +where + L: Send, + R: Send, + A: Send + FromParallelIterator<L>, + B: Send + FromParallelIterator<R>, +{ + fn from_par_iter<I>(pi: I) -> Self + where + I: IntoParallelIterator<Item = Either<L, R>>, + { + fn identity<T>(x: T) -> T { + x + } + + let (a, b): (Collector<A>, Collector<B>) = pi.into_par_iter().partition_map(identity); + (a.result.unwrap(), b.result.unwrap()) + } +} + +/// Shim to implement a one-time `ParallelExtend` using `FromParallelIterator`. +struct Collector<FromT> { + result: Option<FromT>, +} + +impl<FromT> Default for Collector<FromT> { + fn default() -> Self { + Collector { result: None } + } +} + +impl<T, FromT> ParallelExtend<T> for Collector<FromT> +where + T: Send, + FromT: Send + FromParallelIterator<T>, +{ + fn par_extend<I>(&mut self, pi: I) + where + I: IntoParallelIterator<Item = T>, + { + debug_assert!(self.result.is_none()); + self.result = Some(pi.into_par_iter().collect()); + } +} |