1 //! Traits for writing parallel programs using an iterator-style interface
2 //!
3 //! You will rarely need to interact with this module directly unless you have
4 //! need to name one of the iterator types.
5 //!
6 //! Parallel iterators make it easy to write iterator-like chains that
7 //! execute in parallel: typically all you have to do is convert the
8 //! first `.iter()` (or `iter_mut()`, `into_iter()`, etc) method into
9 //! `par_iter()` (or `par_iter_mut()`, `into_par_iter()`, etc). For
10 //! example, to compute the sum of the squares of a sequence of
11 //! integers, one might write:
12 //!
13 //! ```rust
14 //! use rayon::prelude::*;
15 //! fn sum_of_squares(input: &[i32]) -> i32 {
16 //!     input.par_iter()
17 //!          .map(|i| i * i)
18 //!          .sum()
19 //! }
20 //! ```
21 //!
22 //! Or, to increment all the integers in a slice, you could write:
23 //!
24 //! ```rust
25 //! use rayon::prelude::*;
26 //! fn increment_all(input: &mut [i32]) {
27 //!     input.par_iter_mut()
28 //!          .for_each(|p| *p += 1);
29 //! }
30 //! ```
31 //!
32 //! To use parallel iterators, first import the traits by adding
33 //! something like `use rayon::prelude::*` to your module. You can
34 //! then call `par_iter`, `par_iter_mut`, or `into_par_iter` to get a
35 //! parallel iterator. Like a [regular iterator][], parallel
36 //! iterators work by first constructing a computation and then
37 //! executing it.
38 //!
39 //! In addition to `par_iter()` and friends, some types offer other
40 //! ways to create (or consume) parallel iterators:
41 //!
42 //! - Slices (`&[T]`, `&mut [T]`) offer methods like `par_split` and
43 //!   `par_windows`, as well as various parallel sorting
44 //!   operations. See [the `ParallelSlice` trait] for the full list.
45 //! - Strings (`&str`) offer methods like `par_split` and `par_lines`.
46 //!   See [the `ParallelString` trait] for the full list.
47 //! - Various collections offer [`par_extend`], which grows a
48 //!   collection given a parallel iterator. (If you don't have a
49 //!   collection to extend, you can use [`collect()`] to create a new
50 //!   one from scratch.)
51 //!
52 //! [the `ParallelSlice` trait]: ../slice/trait.ParallelSlice.html
53 //! [the `ParallelString` trait]: ../str/trait.ParallelString.html
54 //! [`par_extend`]: trait.ParallelExtend.html
55 //! [`collect()`]: trait.ParallelIterator.html#method.collect
56 //!
57 //! To see the full range of methods available on parallel iterators,
58 //! check out the [`ParallelIterator`] and [`IndexedParallelIterator`]
59 //! traits.
60 //!
61 //! If you'd like to build a custom parallel iterator, or to write your own
62 //! combinator, then check out the [split] function and the [plumbing] module.
63 //!
64 //! [regular iterator]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
65 //! [`ParallelIterator`]: trait.ParallelIterator.html
66 //! [`IndexedParallelIterator`]: trait.IndexedParallelIterator.html
67 //! [split]: fn.split.html
68 //! [plumbing]: plumbing/index.html
69 //!
70 //! Note: Several of the `ParallelIterator` methods rely on a `Try` trait which
71 //! has been deliberately obscured from the public API.  This trait is intended
72 //! to mirror the unstable `std::ops::Try` with implementations for `Option` and
73 //! `Result`, where `Some`/`Ok` values will let those iterators continue, but
74 //! `None`/`Err` values will exit early.
75 //!
76 //! A note about object safety: It is currently _not_ possible to wrap
77 //! a `ParallelIterator` (or any trait that depends on it) using a
78 //! `Box<dyn ParallelIterator>` or other kind of dynamic allocation,
79 //! because `ParallelIterator` is **not object-safe**.
80 //! (This keeps the implementation simpler and allows extra optimizations.)
81 
82 use self::plumbing::*;
83 use self::private::Try;
84 pub use either::Either;
85 use std::cmp::{self, Ordering};
86 use std::iter::{Product, Sum};
87 use std::ops::{Fn, RangeBounds};
88 
89 pub mod plumbing;
90 
91 #[cfg(test)]
92 mod test;
93 
94 // There is a method to the madness here:
95 //
96 // - These modules are private but expose certain types to the end-user
97 //   (e.g., `enumerate::Enumerate`) -- specifically, the types that appear in the
98 //   public API surface of the `ParallelIterator` traits.
99 // - In **this** module, those public types are always used unprefixed, which forces
100 //   us to add a `pub use` and helps identify if we missed anything.
101 // - In contrast, items that appear **only** in the body of a method,
102 //   e.g. `find::find()`, are always used **prefixed**, so that they
103 //   can be readily distinguished.
104 
105 mod chain;
106 mod chunks;
107 mod cloned;
108 mod collect;
109 mod copied;
110 mod empty;
111 mod enumerate;
112 mod extend;
113 mod filter;
114 mod filter_map;
115 mod find;
116 mod find_first_last;
117 mod flat_map;
118 mod flat_map_iter;
119 mod flatten;
120 mod flatten_iter;
121 mod fold;
122 mod fold_chunks;
123 mod fold_chunks_with;
124 mod for_each;
125 mod from_par_iter;
126 mod inspect;
127 mod interleave;
128 mod interleave_shortest;
129 mod intersperse;
130 mod len;
131 mod map;
132 mod map_with;
133 mod multizip;
134 mod noop;
135 mod once;
136 mod panic_fuse;
137 mod par_bridge;
138 mod positions;
139 mod product;
140 mod reduce;
141 mod repeat;
142 mod rev;
143 mod skip;
144 mod skip_any;
145 mod skip_any_while;
146 mod splitter;
147 mod step_by;
148 mod sum;
149 mod take;
150 mod take_any;
151 mod take_any_while;
152 mod try_fold;
153 mod try_reduce;
154 mod try_reduce_with;
155 mod unzip;
156 mod update;
157 mod while_some;
158 mod zip;
159 mod zip_eq;
160 
161 pub use self::{
162     chain::Chain,
163     chunks::Chunks,
164     cloned::Cloned,
165     copied::Copied,
166     empty::{empty, Empty},
167     enumerate::Enumerate,
168     filter::Filter,
169     filter_map::FilterMap,
170     flat_map::FlatMap,
171     flat_map_iter::FlatMapIter,
172     flatten::Flatten,
173     flatten_iter::FlattenIter,
174     fold::{Fold, FoldWith},
175     fold_chunks::FoldChunks,
176     fold_chunks_with::FoldChunksWith,
177     inspect::Inspect,
178     interleave::Interleave,
179     interleave_shortest::InterleaveShortest,
180     intersperse::Intersperse,
181     len::{MaxLen, MinLen},
182     map::Map,
183     map_with::{MapInit, MapWith},
184     multizip::MultiZip,
185     once::{once, Once},
186     panic_fuse::PanicFuse,
187     par_bridge::{IterBridge, ParallelBridge},
188     positions::Positions,
189     repeat::{repeat, repeatn, Repeat, RepeatN},
190     rev::Rev,
191     skip::Skip,
192     skip_any::SkipAny,
193     skip_any_while::SkipAnyWhile,
194     splitter::{split, Split},
195     step_by::StepBy,
196     take::Take,
197     take_any::TakeAny,
198     take_any_while::TakeAnyWhile,
199     try_fold::{TryFold, TryFoldWith},
200     update::Update,
201     while_some::WhileSome,
202     zip::Zip,
203     zip_eq::ZipEq,
204 };
205 
206 /// `IntoParallelIterator` implements the conversion to a [`ParallelIterator`].
207 ///
208 /// By implementing `IntoParallelIterator` for a type, you define how it will
209 /// transformed into an iterator. This is a parallel version of the standard
210 /// library's [`std::iter::IntoIterator`] trait.
211 ///
212 /// [`ParallelIterator`]: trait.ParallelIterator.html
213 /// [`std::iter::IntoIterator`]: https://doc.rust-lang.org/std/iter/trait.IntoIterator.html
214 pub trait IntoParallelIterator {
215     /// The parallel iterator type that will be created.
216     type Iter: ParallelIterator<Item = Self::Item>;
217 
218     /// The type of item that the parallel iterator will produce.
219     type Item: Send;
220 
221     /// Converts `self` into a parallel iterator.
222     ///
223     /// # Examples
224     ///
225     /// ```
226     /// use rayon::prelude::*;
227     ///
228     /// println!("counting in parallel:");
229     /// (0..100).into_par_iter()
230     ///     .for_each(|i| println!("{}", i));
231     /// ```
232     ///
233     /// This conversion is often implicit for arguments to methods like [`zip`].
234     ///
235     /// ```
236     /// use rayon::prelude::*;
237     ///
238     /// let v: Vec<_> = (0..5).into_par_iter().zip(5..10).collect();
239     /// assert_eq!(v, [(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]);
240     /// ```
241     ///
242     /// [`zip`]: trait.IndexedParallelIterator.html#method.zip
into_par_iter(self) -> Self::Iter243     fn into_par_iter(self) -> Self::Iter;
244 }
245 
246 /// `IntoParallelRefIterator` implements the conversion to a
247 /// [`ParallelIterator`], providing shared references to the data.
248 ///
249 /// This is a parallel version of the `iter()` method
250 /// defined by various collections.
251 ///
252 /// This trait is automatically implemented
253 /// `for I where &I: IntoParallelIterator`. In most cases, users
254 /// will want to implement [`IntoParallelIterator`] rather than implement
255 /// this trait directly.
256 ///
257 /// [`ParallelIterator`]: trait.ParallelIterator.html
258 /// [`IntoParallelIterator`]: trait.IntoParallelIterator.html
259 pub trait IntoParallelRefIterator<'data> {
260     /// The type of the parallel iterator that will be returned.
261     type Iter: ParallelIterator<Item = Self::Item>;
262 
263     /// The type of item that the parallel iterator will produce.
264     /// This will typically be an `&'data T` reference type.
265     type Item: Send + 'data;
266 
267     /// Converts `self` into a parallel iterator.
268     ///
269     /// # Examples
270     ///
271     /// ```
272     /// use rayon::prelude::*;
273     ///
274     /// let v: Vec<_> = (0..100).collect();
275     /// assert_eq!(v.par_iter().sum::<i32>(), 100 * 99 / 2);
276     ///
277     /// // `v.par_iter()` is shorthand for `(&v).into_par_iter()`,
278     /// // producing the exact same references.
279     /// assert!(v.par_iter().zip(&v)
280     ///          .all(|(a, b)| std::ptr::eq(a, b)));
281     /// ```
par_iter(&'data self) -> Self::Iter282     fn par_iter(&'data self) -> Self::Iter;
283 }
284 
285 impl<'data, I: 'data + ?Sized> IntoParallelRefIterator<'data> for I
286 where
287     &'data I: IntoParallelIterator,
288 {
289     type Iter = <&'data I as IntoParallelIterator>::Iter;
290     type Item = <&'data I as IntoParallelIterator>::Item;
291 
par_iter(&'data self) -> Self::Iter292     fn par_iter(&'data self) -> Self::Iter {
293         self.into_par_iter()
294     }
295 }
296 
297 /// `IntoParallelRefMutIterator` implements the conversion to a
298 /// [`ParallelIterator`], providing mutable references to the data.
299 ///
300 /// This is a parallel version of the `iter_mut()` method
301 /// defined by various collections.
302 ///
303 /// This trait is automatically implemented
304 /// `for I where &mut I: IntoParallelIterator`. In most cases, users
305 /// will want to implement [`IntoParallelIterator`] rather than implement
306 /// this trait directly.
307 ///
308 /// [`ParallelIterator`]: trait.ParallelIterator.html
309 /// [`IntoParallelIterator`]: trait.IntoParallelIterator.html
310 pub trait IntoParallelRefMutIterator<'data> {
311     /// The type of iterator that will be created.
312     type Iter: ParallelIterator<Item = Self::Item>;
313 
314     /// The type of item that will be produced; this is typically an
315     /// `&'data mut T` reference.
316     type Item: Send + 'data;
317 
318     /// Creates the parallel iterator from `self`.
319     ///
320     /// # Examples
321     ///
322     /// ```
323     /// use rayon::prelude::*;
324     ///
325     /// let mut v = vec![0usize; 5];
326     /// v.par_iter_mut().enumerate().for_each(|(i, x)| *x = i);
327     /// assert_eq!(v, [0, 1, 2, 3, 4]);
328     /// ```
par_iter_mut(&'data mut self) -> Self::Iter329     fn par_iter_mut(&'data mut self) -> Self::Iter;
330 }
331 
332 impl<'data, I: 'data + ?Sized> IntoParallelRefMutIterator<'data> for I
333 where
334     &'data mut I: IntoParallelIterator,
335 {
336     type Iter = <&'data mut I as IntoParallelIterator>::Iter;
337     type Item = <&'data mut I as IntoParallelIterator>::Item;
338 
par_iter_mut(&'data mut self) -> Self::Iter339     fn par_iter_mut(&'data mut self) -> Self::Iter {
340         self.into_par_iter()
341     }
342 }
343 
344 /// Parallel version of the standard iterator trait.
345 ///
346 /// The combinators on this trait are available on **all** parallel
347 /// iterators.  Additional methods can be found on the
348 /// [`IndexedParallelIterator`] trait: those methods are only
349 /// available for parallel iterators where the number of items is
350 /// known in advance (so, e.g., after invoking `filter`, those methods
351 /// become unavailable).
352 ///
353 /// For examples of using parallel iterators, see [the docs on the
354 /// `iter` module][iter].
355 ///
356 /// [iter]: index.html
357 /// [`IndexedParallelIterator`]: trait.IndexedParallelIterator.html
358 pub trait ParallelIterator: Sized + Send {
359     /// The type of item that this parallel iterator produces.
360     /// For example, if you use the [`for_each`] method, this is the type of
361     /// item that your closure will be invoked with.
362     ///
363     /// [`for_each`]: #method.for_each
364     type Item: Send;
365 
366     /// Executes `OP` on each item produced by the iterator, in parallel.
367     ///
368     /// # Examples
369     ///
370     /// ```
371     /// use rayon::prelude::*;
372     ///
373     /// (0..100).into_par_iter().for_each(|x| println!("{:?}", x));
374     /// ```
for_each<OP>(self, op: OP) where OP: Fn(Self::Item) + Sync + Send,375     fn for_each<OP>(self, op: OP)
376     where
377         OP: Fn(Self::Item) + Sync + Send,
378     {
379         for_each::for_each(self, &op)
380     }
381 
382     /// Executes `OP` on the given `init` value with each item produced by
383     /// the iterator, in parallel.
384     ///
385     /// The `init` value will be cloned only as needed to be paired with
386     /// the group of items in each rayon job.  It does not require the type
387     /// to be `Sync`.
388     ///
389     /// # Examples
390     ///
391     /// ```
392     /// use std::sync::mpsc::channel;
393     /// use rayon::prelude::*;
394     ///
395     /// let (sender, receiver) = channel();
396     ///
397     /// (0..5).into_par_iter().for_each_with(sender, |s, x| s.send(x).unwrap());
398     ///
399     /// let mut res: Vec<_> = receiver.iter().collect();
400     ///
401     /// res.sort();
402     ///
403     /// assert_eq!(&res[..], &[0, 1, 2, 3, 4])
404     /// ```
for_each_with<OP, T>(self, init: T, op: OP) where OP: Fn(&mut T, Self::Item) + Sync + Send, T: Send + Clone,405     fn for_each_with<OP, T>(self, init: T, op: OP)
406     where
407         OP: Fn(&mut T, Self::Item) + Sync + Send,
408         T: Send + Clone,
409     {
410         self.map_with(init, op).collect()
411     }
412 
413     /// Executes `OP` on a value returned by `init` with each item produced by
414     /// the iterator, in parallel.
415     ///
416     /// The `init` function will be called only as needed for a value to be
417     /// paired with the group of items in each rayon job.  There is no
418     /// constraint on that returned type at all!
419     ///
420     /// # Examples
421     ///
422     /// ```
423     /// use rand::Rng;
424     /// use rayon::prelude::*;
425     ///
426     /// let mut v = vec![0u8; 1_000_000];
427     ///
428     /// v.par_chunks_mut(1000)
429     ///     .for_each_init(
430     ///         || rand::thread_rng(),
431     ///         |rng, chunk| rng.fill(chunk),
432     ///     );
433     ///
434     /// // There's a remote chance that this will fail...
435     /// for i in 0u8..=255 {
436     ///     assert!(v.contains(&i));
437     /// }
438     /// ```
for_each_init<OP, INIT, T>(self, init: INIT, op: OP) where OP: Fn(&mut T, Self::Item) + Sync + Send, INIT: Fn() -> T + Sync + Send,439     fn for_each_init<OP, INIT, T>(self, init: INIT, op: OP)
440     where
441         OP: Fn(&mut T, Self::Item) + Sync + Send,
442         INIT: Fn() -> T + Sync + Send,
443     {
444         self.map_init(init, op).collect()
445     }
446 
447     /// Executes a fallible `OP` on each item produced by the iterator, in parallel.
448     ///
449     /// If the `OP` returns `Result::Err` or `Option::None`, we will attempt to
450     /// stop processing the rest of the items in the iterator as soon as
451     /// possible, and we will return that terminating value.  Otherwise, we will
452     /// return an empty `Result::Ok(())` or `Option::Some(())`.  If there are
453     /// multiple errors in parallel, it is not specified which will be returned.
454     ///
455     /// # Examples
456     ///
457     /// ```
458     /// use rayon::prelude::*;
459     /// use std::io::{self, Write};
460     ///
461     /// // This will stop iteration early if there's any write error, like
462     /// // having piped output get closed on the other end.
463     /// (0..100).into_par_iter()
464     ///     .try_for_each(|x| writeln!(io::stdout(), "{:?}", x))
465     ///     .expect("expected no write errors");
466     /// ```
try_for_each<OP, R>(self, op: OP) -> R where OP: Fn(Self::Item) -> R + Sync + Send, R: Try<Output = ()> + Send,467     fn try_for_each<OP, R>(self, op: OP) -> R
468     where
469         OP: Fn(Self::Item) -> R + Sync + Send,
470         R: Try<Output = ()> + Send,
471     {
472         fn ok<R: Try<Output = ()>>(_: (), _: ()) -> R {
473             R::from_output(())
474         }
475 
476         self.map(op).try_reduce(<()>::default, ok)
477     }
478 
479     /// Executes a fallible `OP` on the given `init` value with each item
480     /// produced by the iterator, in parallel.
481     ///
482     /// This combines the `init` semantics of [`for_each_with()`] and the
483     /// failure semantics of [`try_for_each()`].
484     ///
485     /// [`for_each_with()`]: #method.for_each_with
486     /// [`try_for_each()`]: #method.try_for_each
487     ///
488     /// # Examples
489     ///
490     /// ```
491     /// use std::sync::mpsc::channel;
492     /// use rayon::prelude::*;
493     ///
494     /// let (sender, receiver) = channel();
495     ///
496     /// (0..5).into_par_iter()
497     ///     .try_for_each_with(sender, |s, x| s.send(x))
498     ///     .expect("expected no send errors");
499     ///
500     /// let mut res: Vec<_> = receiver.iter().collect();
501     ///
502     /// res.sort();
503     ///
504     /// assert_eq!(&res[..], &[0, 1, 2, 3, 4])
505     /// ```
try_for_each_with<OP, T, R>(self, init: T, op: OP) -> R where OP: Fn(&mut T, Self::Item) -> R + Sync + Send, T: Send + Clone, R: Try<Output = ()> + Send,506     fn try_for_each_with<OP, T, R>(self, init: T, op: OP) -> R
507     where
508         OP: Fn(&mut T, Self::Item) -> R + Sync + Send,
509         T: Send + Clone,
510         R: Try<Output = ()> + Send,
511     {
512         fn ok<R: Try<Output = ()>>(_: (), _: ()) -> R {
513             R::from_output(())
514         }
515 
516         self.map_with(init, op).try_reduce(<()>::default, ok)
517     }
518 
519     /// Executes a fallible `OP` on a value returned by `init` with each item
520     /// produced by the iterator, in parallel.
521     ///
522     /// This combines the `init` semantics of [`for_each_init()`] and the
523     /// failure semantics of [`try_for_each()`].
524     ///
525     /// [`for_each_init()`]: #method.for_each_init
526     /// [`try_for_each()`]: #method.try_for_each
527     ///
528     /// # Examples
529     ///
530     /// ```
531     /// use rand::Rng;
532     /// use rayon::prelude::*;
533     ///
534     /// let mut v = vec![0u8; 1_000_000];
535     ///
536     /// v.par_chunks_mut(1000)
537     ///     .try_for_each_init(
538     ///         || rand::thread_rng(),
539     ///         |rng, chunk| rng.try_fill(chunk),
540     ///     )
541     ///     .expect("expected no rand errors");
542     ///
543     /// // There's a remote chance that this will fail...
544     /// for i in 0u8..=255 {
545     ///     assert!(v.contains(&i));
546     /// }
547     /// ```
try_for_each_init<OP, INIT, T, R>(self, init: INIT, op: OP) -> R where OP: Fn(&mut T, Self::Item) -> R + Sync + Send, INIT: Fn() -> T + Sync + Send, R: Try<Output = ()> + Send,548     fn try_for_each_init<OP, INIT, T, R>(self, init: INIT, op: OP) -> R
549     where
550         OP: Fn(&mut T, Self::Item) -> R + Sync + Send,
551         INIT: Fn() -> T + Sync + Send,
552         R: Try<Output = ()> + Send,
553     {
554         fn ok<R: Try<Output = ()>>(_: (), _: ()) -> R {
555             R::from_output(())
556         }
557 
558         self.map_init(init, op).try_reduce(<()>::default, ok)
559     }
560 
561     /// Counts the number of items in this parallel iterator.
562     ///
563     /// # Examples
564     ///
565     /// ```
566     /// use rayon::prelude::*;
567     ///
568     /// let count = (0..100).into_par_iter().count();
569     ///
570     /// assert_eq!(count, 100);
571     /// ```
count(self) -> usize572     fn count(self) -> usize {
573         fn one<T>(_: T) -> usize {
574             1
575         }
576 
577         self.map(one).sum()
578     }
579 
580     /// Applies `map_op` to each item of this iterator, producing a new
581     /// iterator with the results.
582     ///
583     /// # Examples
584     ///
585     /// ```
586     /// use rayon::prelude::*;
587     ///
588     /// let mut par_iter = (0..5).into_par_iter().map(|x| x * 2);
589     ///
590     /// let doubles: Vec<_> = par_iter.collect();
591     ///
592     /// assert_eq!(&doubles[..], &[0, 2, 4, 6, 8]);
593     /// ```
map<F, R>(self, map_op: F) -> Map<Self, F> where F: Fn(Self::Item) -> R + Sync + Send, R: Send,594     fn map<F, R>(self, map_op: F) -> Map<Self, F>
595     where
596         F: Fn(Self::Item) -> R + Sync + Send,
597         R: Send,
598     {
599         Map::new(self, map_op)
600     }
601 
602     /// Applies `map_op` to the given `init` value with each item of this
603     /// iterator, producing a new iterator with the results.
604     ///
605     /// The `init` value will be cloned only as needed to be paired with
606     /// the group of items in each rayon job.  It does not require the type
607     /// to be `Sync`.
608     ///
609     /// # Examples
610     ///
611     /// ```
612     /// use std::sync::mpsc::channel;
613     /// use rayon::prelude::*;
614     ///
615     /// let (sender, receiver) = channel();
616     ///
617     /// let a: Vec<_> = (0..5)
618     ///                 .into_par_iter()            // iterating over i32
619     ///                 .map_with(sender, |s, x| {
620     ///                     s.send(x).unwrap();     // sending i32 values through the channel
621     ///                     x                       // returning i32
622     ///                 })
623     ///                 .collect();                 // collecting the returned values into a vector
624     ///
625     /// let mut b: Vec<_> = receiver.iter()         // iterating over the values in the channel
626     ///                             .collect();     // and collecting them
627     /// b.sort();
628     ///
629     /// assert_eq!(a, b);
630     /// ```
map_with<F, T, R>(self, init: T, map_op: F) -> MapWith<Self, T, F> where F: Fn(&mut T, Self::Item) -> R + Sync + Send, T: Send + Clone, R: Send,631     fn map_with<F, T, R>(self, init: T, map_op: F) -> MapWith<Self, T, F>
632     where
633         F: Fn(&mut T, Self::Item) -> R + Sync + Send,
634         T: Send + Clone,
635         R: Send,
636     {
637         MapWith::new(self, init, map_op)
638     }
639 
640     /// Applies `map_op` to a value returned by `init` with each item of this
641     /// iterator, producing a new iterator with the results.
642     ///
643     /// The `init` function will be called only as needed for a value to be
644     /// paired with the group of items in each rayon job.  There is no
645     /// constraint on that returned type at all!
646     ///
647     /// # Examples
648     ///
649     /// ```
650     /// use rand::Rng;
651     /// use rayon::prelude::*;
652     ///
653     /// let a: Vec<_> = (1i32..1_000_000)
654     ///     .into_par_iter()
655     ///     .map_init(
656     ///         || rand::thread_rng(),  // get the thread-local RNG
657     ///         |rng, x| if rng.gen() { // randomly negate items
658     ///             -x
659     ///         } else {
660     ///             x
661     ///         },
662     ///     ).collect();
663     ///
664     /// // There's a remote chance that this will fail...
665     /// assert!(a.iter().any(|&x| x < 0));
666     /// assert!(a.iter().any(|&x| x > 0));
667     /// ```
map_init<F, INIT, T, R>(self, init: INIT, map_op: F) -> MapInit<Self, INIT, F> where F: Fn(&mut T, Self::Item) -> R + Sync + Send, INIT: Fn() -> T + Sync + Send, R: Send,668     fn map_init<F, INIT, T, R>(self, init: INIT, map_op: F) -> MapInit<Self, INIT, F>
669     where
670         F: Fn(&mut T, Self::Item) -> R + Sync + Send,
671         INIT: Fn() -> T + Sync + Send,
672         R: Send,
673     {
674         MapInit::new(self, init, map_op)
675     }
676 
677     /// Creates an iterator which clones all of its elements.  This may be
678     /// useful when you have an iterator over `&T`, but you need `T`, and
679     /// that type implements `Clone`. See also [`copied()`].
680     ///
681     /// [`copied()`]: #method.copied
682     ///
683     /// # Examples
684     ///
685     /// ```
686     /// use rayon::prelude::*;
687     ///
688     /// let a = [1, 2, 3];
689     ///
690     /// let v_cloned: Vec<_> = a.par_iter().cloned().collect();
691     ///
692     /// // cloned is the same as .map(|&x| x), for integers
693     /// let v_map: Vec<_> = a.par_iter().map(|&x| x).collect();
694     ///
695     /// assert_eq!(v_cloned, vec![1, 2, 3]);
696     /// assert_eq!(v_map, vec![1, 2, 3]);
697     /// ```
cloned<'a, T>(self) -> Cloned<Self> where T: 'a + Clone + Send, Self: ParallelIterator<Item = &'a T>,698     fn cloned<'a, T>(self) -> Cloned<Self>
699     where
700         T: 'a + Clone + Send,
701         Self: ParallelIterator<Item = &'a T>,
702     {
703         Cloned::new(self)
704     }
705 
706     /// Creates an iterator which copies all of its elements.  This may be
707     /// useful when you have an iterator over `&T`, but you need `T`, and
708     /// that type implements `Copy`. See also [`cloned()`].
709     ///
710     /// [`cloned()`]: #method.cloned
711     ///
712     /// # Examples
713     ///
714     /// ```
715     /// use rayon::prelude::*;
716     ///
717     /// let a = [1, 2, 3];
718     ///
719     /// let v_copied: Vec<_> = a.par_iter().copied().collect();
720     ///
721     /// // copied is the same as .map(|&x| x), for integers
722     /// let v_map: Vec<_> = a.par_iter().map(|&x| x).collect();
723     ///
724     /// assert_eq!(v_copied, vec![1, 2, 3]);
725     /// assert_eq!(v_map, vec![1, 2, 3]);
726     /// ```
copied<'a, T>(self) -> Copied<Self> where T: 'a + Copy + Send, Self: ParallelIterator<Item = &'a T>,727     fn copied<'a, T>(self) -> Copied<Self>
728     where
729         T: 'a + Copy + Send,
730         Self: ParallelIterator<Item = &'a T>,
731     {
732         Copied::new(self)
733     }
734 
735     /// Applies `inspect_op` to a reference to each item of this iterator,
736     /// producing a new iterator passing through the original items.  This is
737     /// often useful for debugging to see what's happening in iterator stages.
738     ///
739     /// # Examples
740     ///
741     /// ```
742     /// use rayon::prelude::*;
743     ///
744     /// let a = [1, 4, 2, 3];
745     ///
746     /// // this iterator sequence is complex.
747     /// let sum = a.par_iter()
748     ///             .cloned()
749     ///             .filter(|&x| x % 2 == 0)
750     ///             .reduce(|| 0, |sum, i| sum + i);
751     ///
752     /// println!("{}", sum);
753     ///
754     /// // let's add some inspect() calls to investigate what's happening
755     /// let sum = a.par_iter()
756     ///             .cloned()
757     ///             .inspect(|x| println!("about to filter: {}", x))
758     ///             .filter(|&x| x % 2 == 0)
759     ///             .inspect(|x| println!("made it through filter: {}", x))
760     ///             .reduce(|| 0, |sum, i| sum + i);
761     ///
762     /// println!("{}", sum);
763     /// ```
inspect<OP>(self, inspect_op: OP) -> Inspect<Self, OP> where OP: Fn(&Self::Item) + Sync + Send,764     fn inspect<OP>(self, inspect_op: OP) -> Inspect<Self, OP>
765     where
766         OP: Fn(&Self::Item) + Sync + Send,
767     {
768         Inspect::new(self, inspect_op)
769     }
770 
771     /// Mutates each item of this iterator before yielding it.
772     ///
773     /// # Examples
774     ///
775     /// ```
776     /// use rayon::prelude::*;
777     ///
778     /// let par_iter = (0..5).into_par_iter().update(|x| {*x *= 2;});
779     ///
780     /// let doubles: Vec<_> = par_iter.collect();
781     ///
782     /// assert_eq!(&doubles[..], &[0, 2, 4, 6, 8]);
783     /// ```
update<F>(self, update_op: F) -> Update<Self, F> where F: Fn(&mut Self::Item) + Sync + Send,784     fn update<F>(self, update_op: F) -> Update<Self, F>
785     where
786         F: Fn(&mut Self::Item) + Sync + Send,
787     {
788         Update::new(self, update_op)
789     }
790 
791     /// Applies `filter_op` to each item of this iterator, producing a new
792     /// iterator with only the items that gave `true` results.
793     ///
794     /// # Examples
795     ///
796     /// ```
797     /// use rayon::prelude::*;
798     ///
799     /// let mut par_iter = (0..10).into_par_iter().filter(|x| x % 2 == 0);
800     ///
801     /// let even_numbers: Vec<_> = par_iter.collect();
802     ///
803     /// assert_eq!(&even_numbers[..], &[0, 2, 4, 6, 8]);
804     /// ```
filter<P>(self, filter_op: P) -> Filter<Self, P> where P: Fn(&Self::Item) -> bool + Sync + Send,805     fn filter<P>(self, filter_op: P) -> Filter<Self, P>
806     where
807         P: Fn(&Self::Item) -> bool + Sync + Send,
808     {
809         Filter::new(self, filter_op)
810     }
811 
812     /// Applies `filter_op` to each item of this iterator to get an `Option`,
813     /// producing a new iterator with only the items from `Some` results.
814     ///
815     /// # Examples
816     ///
817     /// ```
818     /// use rayon::prelude::*;
819     ///
820     /// let mut par_iter = (0..10).into_par_iter()
821     ///                         .filter_map(|x| {
822     ///                             if x % 2 == 0 { Some(x * 3) }
823     ///                             else { None }
824     ///                         });
825     ///
826     /// let even_numbers: Vec<_> = par_iter.collect();
827     ///
828     /// assert_eq!(&even_numbers[..], &[0, 6, 12, 18, 24]);
829     /// ```
filter_map<P, R>(self, filter_op: P) -> FilterMap<Self, P> where P: Fn(Self::Item) -> Option<R> + Sync + Send, R: Send,830     fn filter_map<P, R>(self, filter_op: P) -> FilterMap<Self, P>
831     where
832         P: Fn(Self::Item) -> Option<R> + Sync + Send,
833         R: Send,
834     {
835         FilterMap::new(self, filter_op)
836     }
837 
838     /// Applies `map_op` to each item of this iterator to get nested parallel iterators,
839     /// producing a new parallel iterator that flattens these back into one.
840     ///
841     /// See also [`flat_map_iter`](#method.flat_map_iter).
842     ///
843     /// # Examples
844     ///
845     /// ```
846     /// use rayon::prelude::*;
847     ///
848     /// let a = [[1, 2], [3, 4], [5, 6], [7, 8]];
849     ///
850     /// let par_iter = a.par_iter().cloned().flat_map(|a| a.to_vec());
851     ///
852     /// let vec: Vec<_> = par_iter.collect();
853     ///
854     /// assert_eq!(&vec[..], &[1, 2, 3, 4, 5, 6, 7, 8]);
855     /// ```
flat_map<F, PI>(self, map_op: F) -> FlatMap<Self, F> where F: Fn(Self::Item) -> PI + Sync + Send, PI: IntoParallelIterator,856     fn flat_map<F, PI>(self, map_op: F) -> FlatMap<Self, F>
857     where
858         F: Fn(Self::Item) -> PI + Sync + Send,
859         PI: IntoParallelIterator,
860     {
861         FlatMap::new(self, map_op)
862     }
863 
864     /// Applies `map_op` to each item of this iterator to get nested serial iterators,
865     /// producing a new parallel iterator that flattens these back into one.
866     ///
867     /// # `flat_map_iter` versus `flat_map`
868     ///
869     /// These two methods are similar but behave slightly differently. With [`flat_map`],
870     /// each of the nested iterators must be a parallel iterator, and they will be further
871     /// split up with nested parallelism. With `flat_map_iter`, each nested iterator is a
872     /// sequential `Iterator`, and we only parallelize _between_ them, while the items
873     /// produced by each nested iterator are processed sequentially.
874     ///
875     /// When choosing between these methods, consider whether nested parallelism suits the
876     /// potential iterators at hand. If there's little computation involved, or its length
877     /// is much less than the outer parallel iterator, then it may perform better to avoid
878     /// the overhead of parallelism, just flattening sequentially with `flat_map_iter`.
879     /// If there is a lot of computation, potentially outweighing the outer parallel
880     /// iterator, then the nested parallelism of `flat_map` may be worthwhile.
881     ///
882     /// [`flat_map`]: #method.flat_map
883     ///
884     /// # Examples
885     ///
886     /// ```
887     /// use rayon::prelude::*;
888     /// use std::cell::RefCell;
889     ///
890     /// let a = [[1, 2], [3, 4], [5, 6], [7, 8]];
891     ///
892     /// let par_iter = a.par_iter().flat_map_iter(|a| {
893     ///     // The serial iterator doesn't have to be thread-safe, just its items.
894     ///     let cell_iter = RefCell::new(a.iter().cloned());
895     ///     std::iter::from_fn(move || cell_iter.borrow_mut().next())
896     /// });
897     ///
898     /// let vec: Vec<_> = par_iter.collect();
899     ///
900     /// assert_eq!(&vec[..], &[1, 2, 3, 4, 5, 6, 7, 8]);
901     /// ```
flat_map_iter<F, SI>(self, map_op: F) -> FlatMapIter<Self, F> where F: Fn(Self::Item) -> SI + Sync + Send, SI: IntoIterator, SI::Item: Send,902     fn flat_map_iter<F, SI>(self, map_op: F) -> FlatMapIter<Self, F>
903     where
904         F: Fn(Self::Item) -> SI + Sync + Send,
905         SI: IntoIterator,
906         SI::Item: Send,
907     {
908         FlatMapIter::new(self, map_op)
909     }
910 
911     /// An adaptor that flattens parallel-iterable `Item`s into one large iterator.
912     ///
913     /// See also [`flatten_iter`](#method.flatten_iter).
914     ///
915     /// # Examples
916     ///
917     /// ```
918     /// use rayon::prelude::*;
919     ///
920     /// let x: Vec<Vec<_>> = vec![vec![1, 2], vec![3, 4]];
921     /// let y: Vec<_> = x.into_par_iter().flatten().collect();
922     ///
923     /// assert_eq!(y, vec![1, 2, 3, 4]);
924     /// ```
flatten(self) -> Flatten<Self> where Self::Item: IntoParallelIterator,925     fn flatten(self) -> Flatten<Self>
926     where
927         Self::Item: IntoParallelIterator,
928     {
929         Flatten::new(self)
930     }
931 
932     /// An adaptor that flattens serial-iterable `Item`s into one large iterator.
933     ///
934     /// See also [`flatten`](#method.flatten) and the analogous comparison of
935     /// [`flat_map_iter` versus `flat_map`](#flat_map_iter-versus-flat_map).
936     ///
937     /// # Examples
938     ///
939     /// ```
940     /// use rayon::prelude::*;
941     ///
942     /// let x: Vec<Vec<_>> = vec![vec![1, 2], vec![3, 4]];
943     /// let iters: Vec<_> = x.into_iter().map(Vec::into_iter).collect();
944     /// let y: Vec<_> = iters.into_par_iter().flatten_iter().collect();
945     ///
946     /// assert_eq!(y, vec![1, 2, 3, 4]);
947     /// ```
flatten_iter(self) -> FlattenIter<Self> where Self::Item: IntoIterator, <Self::Item as IntoIterator>::Item: Send,948     fn flatten_iter(self) -> FlattenIter<Self>
949     where
950         Self::Item: IntoIterator,
951         <Self::Item as IntoIterator>::Item: Send,
952     {
953         FlattenIter::new(self)
954     }
955 
956     /// Reduces the items in the iterator into one item using `op`.
957     /// The argument `identity` should be a closure that can produce
958     /// "identity" value which may be inserted into the sequence as
959     /// needed to create opportunities for parallel execution. So, for
960     /// example, if you are doing a summation, then `identity()` ought
961     /// to produce something that represents the zero for your type
962     /// (but consider just calling `sum()` in that case).
963     ///
964     /// # Examples
965     ///
966     /// ```
967     /// // Iterate over a sequence of pairs `(x0, y0), ..., (xN, yN)`
968     /// // and use reduce to compute one pair `(x0 + ... + xN, y0 + ... + yN)`
969     /// // where the first/second elements are summed separately.
970     /// use rayon::prelude::*;
971     /// let sums = [(0, 1), (5, 6), (16, 2), (8, 9)]
972     ///            .par_iter()        // iterating over &(i32, i32)
973     ///            .cloned()          // iterating over (i32, i32)
974     ///            .reduce(|| (0, 0), // the "identity" is 0 in both columns
975     ///                    |a, b| (a.0 + b.0, a.1 + b.1));
976     /// assert_eq!(sums, (0 + 5 + 16 + 8, 1 + 6 + 2 + 9));
977     /// ```
978     ///
979     /// **Note:** unlike a sequential `fold` operation, the order in
980     /// which `op` will be applied to reduce the result is not fully
981     /// specified. So `op` should be [associative] or else the results
982     /// will be non-deterministic. And of course `identity()` should
983     /// produce a true identity.
984     ///
985     /// [associative]: https://en.wikipedia.org/wiki/Associative_property
reduce<OP, ID>(self, identity: ID, op: OP) -> Self::Item where OP: Fn(Self::Item, Self::Item) -> Self::Item + Sync + Send, ID: Fn() -> Self::Item + Sync + Send,986     fn reduce<OP, ID>(self, identity: ID, op: OP) -> Self::Item
987     where
988         OP: Fn(Self::Item, Self::Item) -> Self::Item + Sync + Send,
989         ID: Fn() -> Self::Item + Sync + Send,
990     {
991         reduce::reduce(self, identity, op)
992     }
993 
994     /// Reduces the items in the iterator into one item using `op`.
995     /// If the iterator is empty, `None` is returned; otherwise,
996     /// `Some` is returned.
997     ///
998     /// This version of `reduce` is simple but somewhat less
999     /// efficient. If possible, it is better to call `reduce()`, which
1000     /// requires an identity element.
1001     ///
1002     /// # Examples
1003     ///
1004     /// ```
1005     /// use rayon::prelude::*;
1006     /// let sums = [(0, 1), (5, 6), (16, 2), (8, 9)]
1007     ///            .par_iter()        // iterating over &(i32, i32)
1008     ///            .cloned()          // iterating over (i32, i32)
1009     ///            .reduce_with(|a, b| (a.0 + b.0, a.1 + b.1))
1010     ///            .unwrap();
1011     /// assert_eq!(sums, (0 + 5 + 16 + 8, 1 + 6 + 2 + 9));
1012     /// ```
1013     ///
1014     /// **Note:** unlike a sequential `fold` operation, the order in
1015     /// which `op` will be applied to reduce the result is not fully
1016     /// specified. So `op` should be [associative] or else the results
1017     /// will be non-deterministic.
1018     ///
1019     /// [associative]: https://en.wikipedia.org/wiki/Associative_property
reduce_with<OP>(self, op: OP) -> Option<Self::Item> where OP: Fn(Self::Item, Self::Item) -> Self::Item + Sync + Send,1020     fn reduce_with<OP>(self, op: OP) -> Option<Self::Item>
1021     where
1022         OP: Fn(Self::Item, Self::Item) -> Self::Item + Sync + Send,
1023     {
1024         fn opt_fold<T>(op: impl Fn(T, T) -> T) -> impl Fn(Option<T>, T) -> Option<T> {
1025             move |opt_a, b| match opt_a {
1026                 Some(a) => Some(op(a, b)),
1027                 None => Some(b),
1028             }
1029         }
1030 
1031         fn opt_reduce<T>(op: impl Fn(T, T) -> T) -> impl Fn(Option<T>, Option<T>) -> Option<T> {
1032             move |opt_a, opt_b| match (opt_a, opt_b) {
1033                 (Some(a), Some(b)) => Some(op(a, b)),
1034                 (Some(v), None) | (None, Some(v)) => Some(v),
1035                 (None, None) => None,
1036             }
1037         }
1038 
1039         self.fold(<_>::default, opt_fold(&op))
1040             .reduce(<_>::default, opt_reduce(&op))
1041     }
1042 
1043     /// Reduces the items in the iterator into one item using a fallible `op`.
1044     /// The `identity` argument is used the same way as in [`reduce()`].
1045     ///
1046     /// [`reduce()`]: #method.reduce
1047     ///
1048     /// If a `Result::Err` or `Option::None` item is found, or if `op` reduces
1049     /// to one, we will attempt to stop processing the rest of the items in the
1050     /// iterator as soon as possible, and we will return that terminating value.
1051     /// Otherwise, we will return the final reduced `Result::Ok(T)` or
1052     /// `Option::Some(T)`.  If there are multiple errors in parallel, it is not
1053     /// specified which will be returned.
1054     ///
1055     /// # Examples
1056     ///
1057     /// ```
1058     /// use rayon::prelude::*;
1059     ///
1060     /// // Compute the sum of squares, being careful about overflow.
1061     /// fn sum_squares<I: IntoParallelIterator<Item = i32>>(iter: I) -> Option<i32> {
1062     ///     iter.into_par_iter()
1063     ///         .map(|i| i.checked_mul(i))            // square each item,
1064     ///         .try_reduce(|| 0, i32::checked_add)   // and add them up!
1065     /// }
1066     /// assert_eq!(sum_squares(0..5), Some(0 + 1 + 4 + 9 + 16));
1067     ///
1068     /// // The sum might overflow
1069     /// assert_eq!(sum_squares(0..10_000), None);
1070     ///
1071     /// // Or the squares might overflow before it even reaches `try_reduce`
1072     /// assert_eq!(sum_squares(1_000_000..1_000_001), None);
1073     /// ```
try_reduce<T, OP, ID>(self, identity: ID, op: OP) -> Self::Item where OP: Fn(T, T) -> Self::Item + Sync + Send, ID: Fn() -> T + Sync + Send, Self::Item: Try<Output = T>,1074     fn try_reduce<T, OP, ID>(self, identity: ID, op: OP) -> Self::Item
1075     where
1076         OP: Fn(T, T) -> Self::Item + Sync + Send,
1077         ID: Fn() -> T + Sync + Send,
1078         Self::Item: Try<Output = T>,
1079     {
1080         try_reduce::try_reduce(self, identity, op)
1081     }
1082 
1083     /// Reduces the items in the iterator into one item using a fallible `op`.
1084     ///
1085     /// Like [`reduce_with()`], if the iterator is empty, `None` is returned;
1086     /// otherwise, `Some` is returned.  Beyond that, it behaves like
1087     /// [`try_reduce()`] for handling `Err`/`None`.
1088     ///
1089     /// [`reduce_with()`]: #method.reduce_with
1090     /// [`try_reduce()`]: #method.try_reduce
1091     ///
1092     /// For instance, with `Option` items, the return value may be:
1093     /// - `None`, the iterator was empty
1094     /// - `Some(None)`, we stopped after encountering `None`.
1095     /// - `Some(Some(x))`, the entire iterator reduced to `x`.
1096     ///
1097     /// With `Result` items, the nesting is more obvious:
1098     /// - `None`, the iterator was empty
1099     /// - `Some(Err(e))`, we stopped after encountering an error `e`.
1100     /// - `Some(Ok(x))`, the entire iterator reduced to `x`.
1101     ///
1102     /// # Examples
1103     ///
1104     /// ```
1105     /// use rayon::prelude::*;
1106     ///
1107     /// let files = ["/dev/null", "/does/not/exist"];
1108     ///
1109     /// // Find the biggest file
1110     /// files.into_par_iter()
1111     ///     .map(|path| std::fs::metadata(path).map(|m| (path, m.len())))
1112     ///     .try_reduce_with(|a, b| {
1113     ///         Ok(if a.1 >= b.1 { a } else { b })
1114     ///     })
1115     ///     .expect("Some value, since the iterator is not empty")
1116     ///     .expect_err("not found");
1117     /// ```
try_reduce_with<T, OP>(self, op: OP) -> Option<Self::Item> where OP: Fn(T, T) -> Self::Item + Sync + Send, Self::Item: Try<Output = T>,1118     fn try_reduce_with<T, OP>(self, op: OP) -> Option<Self::Item>
1119     where
1120         OP: Fn(T, T) -> Self::Item + Sync + Send,
1121         Self::Item: Try<Output = T>,
1122     {
1123         try_reduce_with::try_reduce_with(self, op)
1124     }
1125 
1126     /// Parallel fold is similar to sequential fold except that the
1127     /// sequence of items may be subdivided before it is
1128     /// folded. Consider a list of numbers like `22 3 77 89 46`. If
1129     /// you used sequential fold to add them (`fold(0, |a,b| a+b)`,
1130     /// you would wind up first adding 0 + 22, then 22 + 3, then 25 +
1131     /// 77, and so forth. The **parallel fold** works similarly except
1132     /// that it first breaks up your list into sublists, and hence
1133     /// instead of yielding up a single sum at the end, it yields up
1134     /// multiple sums. The number of results is nondeterministic, as
1135     /// is the point where the breaks occur.
1136     ///
1137     /// So if we did the same parallel fold (`fold(0, |a,b| a+b)`) on
1138     /// our example list, we might wind up with a sequence of two numbers,
1139     /// like so:
1140     ///
1141     /// ```notrust
1142     /// 22 3 77 89 46
1143     ///       |     |
1144     ///     102   135
1145     /// ```
1146     ///
1147     /// Or perhaps these three numbers:
1148     ///
1149     /// ```notrust
1150     /// 22 3 77 89 46
1151     ///       |  |  |
1152     ///     102 89 46
1153     /// ```
1154     ///
1155     /// In general, Rayon will attempt to find good breaking points
1156     /// that keep all of your cores busy.
1157     ///
1158     /// ### Fold versus reduce
1159     ///
1160     /// The `fold()` and `reduce()` methods each take an identity element
1161     /// and a combining function, but they operate rather differently.
1162     ///
1163     /// `reduce()` requires that the identity function has the same
1164     /// type as the things you are iterating over, and it fully
1165     /// reduces the list of items into a single item. So, for example,
1166     /// imagine we are iterating over a list of bytes `bytes: [128_u8,
1167     /// 64_u8, 64_u8]`. If we used `bytes.reduce(|| 0_u8, |a: u8, b:
1168     /// u8| a + b)`, we would get an overflow. This is because `0`,
1169     /// `a`, and `b` here are all bytes, just like the numbers in the
1170     /// list (I wrote the types explicitly above, but those are the
1171     /// only types you can use). To avoid the overflow, we would need
1172     /// to do something like `bytes.map(|b| b as u32).reduce(|| 0, |a,
1173     /// b| a + b)`, in which case our result would be `256`.
1174     ///
1175     /// In contrast, with `fold()`, the identity function does not
1176     /// have to have the same type as the things you are iterating
1177     /// over, and you potentially get back many results. So, if we
1178     /// continue with the `bytes` example from the previous paragraph,
1179     /// we could do `bytes.fold(|| 0_u32, |a, b| a + (b as u32))` to
1180     /// convert our bytes into `u32`. And of course we might not get
1181     /// back a single sum.
1182     ///
1183     /// There is a more subtle distinction as well, though it's
1184     /// actually implied by the above points. When you use `reduce()`,
1185     /// your reduction function is sometimes called with values that
1186     /// were never part of your original parallel iterator (for
1187     /// example, both the left and right might be a partial sum). With
1188     /// `fold()`, in contrast, the left value in the fold function is
1189     /// always the accumulator, and the right value is always from
1190     /// your original sequence.
1191     ///
1192     /// ### Fold vs Map/Reduce
1193     ///
1194     /// Fold makes sense if you have some operation where it is
1195     /// cheaper to create groups of elements at a time. For example,
1196     /// imagine collecting characters into a string. If you were going
1197     /// to use map/reduce, you might try this:
1198     ///
1199     /// ```
1200     /// use rayon::prelude::*;
1201     ///
1202     /// let s =
1203     ///     ['a', 'b', 'c', 'd', 'e']
1204     ///     .par_iter()
1205     ///     .map(|c: &char| format!("{}", c))
1206     ///     .reduce(|| String::new(),
1207     ///             |mut a: String, b: String| { a.push_str(&b); a });
1208     ///
1209     /// assert_eq!(s, "abcde");
1210     /// ```
1211     ///
1212     /// Because reduce produces the same type of element as its input,
1213     /// you have to first map each character into a string, and then
1214     /// you can reduce them. This means we create one string per
1215     /// element in our iterator -- not so great. Using `fold`, we can
1216     /// do this instead:
1217     ///
1218     /// ```
1219     /// use rayon::prelude::*;
1220     ///
1221     /// let s =
1222     ///     ['a', 'b', 'c', 'd', 'e']
1223     ///     .par_iter()
1224     ///     .fold(|| String::new(),
1225     ///             |mut s: String, c: &char| { s.push(*c); s })
1226     ///     .reduce(|| String::new(),
1227     ///             |mut a: String, b: String| { a.push_str(&b); a });
1228     ///
1229     /// assert_eq!(s, "abcde");
1230     /// ```
1231     ///
1232     /// Now `fold` will process groups of our characters at a time,
1233     /// and we only make one string per group. We should wind up with
1234     /// some small-ish number of strings roughly proportional to the
1235     /// number of CPUs you have (it will ultimately depend on how busy
1236     /// your processors are). Note that we still need to do a reduce
1237     /// afterwards to combine those groups of strings into a single
1238     /// string.
1239     ///
1240     /// You could use a similar trick to save partial results (e.g., a
1241     /// cache) or something similar.
1242     ///
1243     /// ### Combining fold with other operations
1244     ///
1245     /// You can combine `fold` with `reduce` if you want to produce a
1246     /// single value. This is then roughly equivalent to a map/reduce
1247     /// combination in effect:
1248     ///
1249     /// ```
1250     /// use rayon::prelude::*;
1251     ///
1252     /// let bytes = 0..22_u8;
1253     /// let sum = bytes.into_par_iter()
1254     ///                .fold(|| 0_u32, |a: u32, b: u8| a + (b as u32))
1255     ///                .sum::<u32>();
1256     ///
1257     /// assert_eq!(sum, (0..22).sum()); // compare to sequential
1258     /// ```
fold<T, ID, F>(self, identity: ID, fold_op: F) -> Fold<Self, ID, F> where F: Fn(T, Self::Item) -> T + Sync + Send, ID: Fn() -> T + Sync + Send, T: Send,1259     fn fold<T, ID, F>(self, identity: ID, fold_op: F) -> Fold<Self, ID, F>
1260     where
1261         F: Fn(T, Self::Item) -> T + Sync + Send,
1262         ID: Fn() -> T + Sync + Send,
1263         T: Send,
1264     {
1265         Fold::new(self, identity, fold_op)
1266     }
1267 
1268     /// Applies `fold_op` to the given `init` value with each item of this
1269     /// iterator, finally producing the value for further use.
1270     ///
1271     /// This works essentially like `fold(|| init.clone(), fold_op)`, except
1272     /// it doesn't require the `init` type to be `Sync`, nor any other form
1273     /// of added synchronization.
1274     ///
1275     /// # Examples
1276     ///
1277     /// ```
1278     /// use rayon::prelude::*;
1279     ///
1280     /// let bytes = 0..22_u8;
1281     /// let sum = bytes.into_par_iter()
1282     ///                .fold_with(0_u32, |a: u32, b: u8| a + (b as u32))
1283     ///                .sum::<u32>();
1284     ///
1285     /// assert_eq!(sum, (0..22).sum()); // compare to sequential
1286     /// ```
fold_with<F, T>(self, init: T, fold_op: F) -> FoldWith<Self, T, F> where F: Fn(T, Self::Item) -> T + Sync + Send, T: Send + Clone,1287     fn fold_with<F, T>(self, init: T, fold_op: F) -> FoldWith<Self, T, F>
1288     where
1289         F: Fn(T, Self::Item) -> T + Sync + Send,
1290         T: Send + Clone,
1291     {
1292         FoldWith::new(self, init, fold_op)
1293     }
1294 
1295     /// Performs a fallible parallel fold.
1296     ///
1297     /// This is a variation of [`fold()`] for operations which can fail with
1298     /// `Option::None` or `Result::Err`.  The first such failure stops
1299     /// processing the local set of items, without affecting other folds in the
1300     /// iterator's subdivisions.
1301     ///
1302     /// Often, `try_fold()` will be followed by [`try_reduce()`]
1303     /// for a final reduction and global short-circuiting effect.
1304     ///
1305     /// [`fold()`]: #method.fold
1306     /// [`try_reduce()`]: #method.try_reduce
1307     ///
1308     /// # Examples
1309     ///
1310     /// ```
1311     /// use rayon::prelude::*;
1312     ///
1313     /// let bytes = 0..22_u8;
1314     /// let sum = bytes.into_par_iter()
1315     ///                .try_fold(|| 0_u32, |a: u32, b: u8| a.checked_add(b as u32))
1316     ///                .try_reduce(|| 0, u32::checked_add);
1317     ///
1318     /// assert_eq!(sum, Some((0..22).sum())); // compare to sequential
1319     /// ```
try_fold<T, R, ID, F>(self, identity: ID, fold_op: F) -> TryFold<Self, R, ID, F> where F: Fn(T, Self::Item) -> R + Sync + Send, ID: Fn() -> T + Sync + Send, R: Try<Output = T> + Send,1320     fn try_fold<T, R, ID, F>(self, identity: ID, fold_op: F) -> TryFold<Self, R, ID, F>
1321     where
1322         F: Fn(T, Self::Item) -> R + Sync + Send,
1323         ID: Fn() -> T + Sync + Send,
1324         R: Try<Output = T> + Send,
1325     {
1326         TryFold::new(self, identity, fold_op)
1327     }
1328 
1329     /// Performs a fallible parallel fold with a cloneable `init` value.
1330     ///
1331     /// This combines the `init` semantics of [`fold_with()`] and the failure
1332     /// semantics of [`try_fold()`].
1333     ///
1334     /// [`fold_with()`]: #method.fold_with
1335     /// [`try_fold()`]: #method.try_fold
1336     ///
1337     /// ```
1338     /// use rayon::prelude::*;
1339     ///
1340     /// let bytes = 0..22_u8;
1341     /// let sum = bytes.into_par_iter()
1342     ///                .try_fold_with(0_u32, |a: u32, b: u8| a.checked_add(b as u32))
1343     ///                .try_reduce(|| 0, u32::checked_add);
1344     ///
1345     /// assert_eq!(sum, Some((0..22).sum())); // compare to sequential
1346     /// ```
try_fold_with<F, T, R>(self, init: T, fold_op: F) -> TryFoldWith<Self, R, F> where F: Fn(T, Self::Item) -> R + Sync + Send, R: Try<Output = T> + Send, T: Clone + Send,1347     fn try_fold_with<F, T, R>(self, init: T, fold_op: F) -> TryFoldWith<Self, R, F>
1348     where
1349         F: Fn(T, Self::Item) -> R + Sync + Send,
1350         R: Try<Output = T> + Send,
1351         T: Clone + Send,
1352     {
1353         TryFoldWith::new(self, init, fold_op)
1354     }
1355 
1356     /// Sums up the items in the iterator.
1357     ///
1358     /// Note that the order in items will be reduced is not specified,
1359     /// so if the `+` operator is not truly [associative] \(as is the
1360     /// case for floating point numbers), then the results are not
1361     /// fully deterministic.
1362     ///
1363     /// [associative]: https://en.wikipedia.org/wiki/Associative_property
1364     ///
1365     /// Basically equivalent to `self.reduce(|| 0, |a, b| a + b)`,
1366     /// except that the type of `0` and the `+` operation may vary
1367     /// depending on the type of value being produced.
1368     ///
1369     /// # Examples
1370     ///
1371     /// ```
1372     /// use rayon::prelude::*;
1373     ///
1374     /// let a = [1, 5, 7];
1375     ///
1376     /// let sum: i32 = a.par_iter().sum();
1377     ///
1378     /// assert_eq!(sum, 13);
1379     /// ```
sum<S>(self) -> S where S: Send + Sum<Self::Item> + Sum<S>,1380     fn sum<S>(self) -> S
1381     where
1382         S: Send + Sum<Self::Item> + Sum<S>,
1383     {
1384         sum::sum(self)
1385     }
1386 
1387     /// Multiplies all the items in the iterator.
1388     ///
1389     /// Note that the order in items will be reduced is not specified,
1390     /// so if the `*` operator is not truly [associative] \(as is the
1391     /// case for floating point numbers), then the results are not
1392     /// fully deterministic.
1393     ///
1394     /// [associative]: https://en.wikipedia.org/wiki/Associative_property
1395     ///
1396     /// Basically equivalent to `self.reduce(|| 1, |a, b| a * b)`,
1397     /// except that the type of `1` and the `*` operation may vary
1398     /// depending on the type of value being produced.
1399     ///
1400     /// # Examples
1401     ///
1402     /// ```
1403     /// use rayon::prelude::*;
1404     ///
1405     /// fn factorial(n: u32) -> u32 {
1406     ///    (1..n+1).into_par_iter().product()
1407     /// }
1408     ///
1409     /// assert_eq!(factorial(0), 1);
1410     /// assert_eq!(factorial(1), 1);
1411     /// assert_eq!(factorial(5), 120);
1412     /// ```
product<P>(self) -> P where P: Send + Product<Self::Item> + Product<P>,1413     fn product<P>(self) -> P
1414     where
1415         P: Send + Product<Self::Item> + Product<P>,
1416     {
1417         product::product(self)
1418     }
1419 
1420     /// Computes the minimum of all the items in the iterator. If the
1421     /// iterator is empty, `None` is returned; otherwise, `Some(min)`
1422     /// is returned.
1423     ///
1424     /// Note that the order in which the items will be reduced is not
1425     /// specified, so if the `Ord` impl is not truly associative, then
1426     /// the results are not deterministic.
1427     ///
1428     /// Basically equivalent to `self.reduce_with(|a, b| cmp::min(a, b))`.
1429     ///
1430     /// # Examples
1431     ///
1432     /// ```
1433     /// use rayon::prelude::*;
1434     ///
1435     /// let a = [45, 74, 32];
1436     ///
1437     /// assert_eq!(a.par_iter().min(), Some(&32));
1438     ///
1439     /// let b: [i32; 0] = [];
1440     ///
1441     /// assert_eq!(b.par_iter().min(), None);
1442     /// ```
min(self) -> Option<Self::Item> where Self::Item: Ord,1443     fn min(self) -> Option<Self::Item>
1444     where
1445         Self::Item: Ord,
1446     {
1447         self.reduce_with(cmp::min)
1448     }
1449 
1450     /// Computes the minimum of all the items in the iterator with respect to
1451     /// the given comparison function. If the iterator is empty, `None` is
1452     /// returned; otherwise, `Some(min)` is returned.
1453     ///
1454     /// Note that the order in which the items will be reduced is not
1455     /// specified, so if the comparison function is not associative, then
1456     /// the results are not deterministic.
1457     ///
1458     /// # Examples
1459     ///
1460     /// ```
1461     /// use rayon::prelude::*;
1462     ///
1463     /// let a = [-3_i32, 77, 53, 240, -1];
1464     ///
1465     /// assert_eq!(a.par_iter().min_by(|x, y| x.cmp(y)), Some(&-3));
1466     /// ```
min_by<F>(self, f: F) -> Option<Self::Item> where F: Sync + Send + Fn(&Self::Item, &Self::Item) -> Ordering,1467     fn min_by<F>(self, f: F) -> Option<Self::Item>
1468     where
1469         F: Sync + Send + Fn(&Self::Item, &Self::Item) -> Ordering,
1470     {
1471         fn min<T>(f: impl Fn(&T, &T) -> Ordering) -> impl Fn(T, T) -> T {
1472             move |a, b| match f(&a, &b) {
1473                 Ordering::Greater => b,
1474                 _ => a,
1475             }
1476         }
1477 
1478         self.reduce_with(min(f))
1479     }
1480 
1481     /// Computes the item that yields the minimum value for the given
1482     /// function. If the iterator is empty, `None` is returned;
1483     /// otherwise, `Some(item)` is returned.
1484     ///
1485     /// Note that the order in which the items will be reduced is not
1486     /// specified, so if the `Ord` impl is not truly associative, then
1487     /// the results are not deterministic.
1488     ///
1489     /// # Examples
1490     ///
1491     /// ```
1492     /// use rayon::prelude::*;
1493     ///
1494     /// let a = [-3_i32, 34, 2, 5, -10, -3, -23];
1495     ///
1496     /// assert_eq!(a.par_iter().min_by_key(|x| x.abs()), Some(&2));
1497     /// ```
min_by_key<K, F>(self, f: F) -> Option<Self::Item> where K: Ord + Send, F: Sync + Send + Fn(&Self::Item) -> K,1498     fn min_by_key<K, F>(self, f: F) -> Option<Self::Item>
1499     where
1500         K: Ord + Send,
1501         F: Sync + Send + Fn(&Self::Item) -> K,
1502     {
1503         fn key<T, K>(f: impl Fn(&T) -> K) -> impl Fn(T) -> (K, T) {
1504             move |x| (f(&x), x)
1505         }
1506 
1507         fn min_key<T, K: Ord>(a: (K, T), b: (K, T)) -> (K, T) {
1508             match (a.0).cmp(&b.0) {
1509                 Ordering::Greater => b,
1510                 _ => a,
1511             }
1512         }
1513 
1514         let (_, x) = self.map(key(f)).reduce_with(min_key)?;
1515         Some(x)
1516     }
1517 
1518     /// Computes the maximum of all the items in the iterator. If the
1519     /// iterator is empty, `None` is returned; otherwise, `Some(max)`
1520     /// is returned.
1521     ///
1522     /// Note that the order in which the items will be reduced is not
1523     /// specified, so if the `Ord` impl is not truly associative, then
1524     /// the results are not deterministic.
1525     ///
1526     /// Basically equivalent to `self.reduce_with(|a, b| cmp::max(a, b))`.
1527     ///
1528     /// # Examples
1529     ///
1530     /// ```
1531     /// use rayon::prelude::*;
1532     ///
1533     /// let a = [45, 74, 32];
1534     ///
1535     /// assert_eq!(a.par_iter().max(), Some(&74));
1536     ///
1537     /// let b: [i32; 0] = [];
1538     ///
1539     /// assert_eq!(b.par_iter().max(), None);
1540     /// ```
max(self) -> Option<Self::Item> where Self::Item: Ord,1541     fn max(self) -> Option<Self::Item>
1542     where
1543         Self::Item: Ord,
1544     {
1545         self.reduce_with(cmp::max)
1546     }
1547 
1548     /// Computes the maximum of all the items in the iterator with respect to
1549     /// the given comparison function. If the iterator is empty, `None` is
1550     /// returned; otherwise, `Some(max)` is returned.
1551     ///
1552     /// Note that the order in which the items will be reduced is not
1553     /// specified, so if the comparison function is not associative, then
1554     /// the results are not deterministic.
1555     ///
1556     /// # Examples
1557     ///
1558     /// ```
1559     /// use rayon::prelude::*;
1560     ///
1561     /// let a = [-3_i32, 77, 53, 240, -1];
1562     ///
1563     /// assert_eq!(a.par_iter().max_by(|x, y| x.abs().cmp(&y.abs())), Some(&240));
1564     /// ```
max_by<F>(self, f: F) -> Option<Self::Item> where F: Sync + Send + Fn(&Self::Item, &Self::Item) -> Ordering,1565     fn max_by<F>(self, f: F) -> Option<Self::Item>
1566     where
1567         F: Sync + Send + Fn(&Self::Item, &Self::Item) -> Ordering,
1568     {
1569         fn max<T>(f: impl Fn(&T, &T) -> Ordering) -> impl Fn(T, T) -> T {
1570             move |a, b| match f(&a, &b) {
1571                 Ordering::Greater => a,
1572                 _ => b,
1573             }
1574         }
1575 
1576         self.reduce_with(max(f))
1577     }
1578 
1579     /// Computes the item that yields the maximum value for the given
1580     /// function. If the iterator is empty, `None` is returned;
1581     /// otherwise, `Some(item)` is returned.
1582     ///
1583     /// Note that the order in which the items will be reduced is not
1584     /// specified, so if the `Ord` impl is not truly associative, then
1585     /// the results are not deterministic.
1586     ///
1587     /// # Examples
1588     ///
1589     /// ```
1590     /// use rayon::prelude::*;
1591     ///
1592     /// let a = [-3_i32, 34, 2, 5, -10, -3, -23];
1593     ///
1594     /// assert_eq!(a.par_iter().max_by_key(|x| x.abs()), Some(&34));
1595     /// ```
max_by_key<K, F>(self, f: F) -> Option<Self::Item> where K: Ord + Send, F: Sync + Send + Fn(&Self::Item) -> K,1596     fn max_by_key<K, F>(self, f: F) -> Option<Self::Item>
1597     where
1598         K: Ord + Send,
1599         F: Sync + Send + Fn(&Self::Item) -> K,
1600     {
1601         fn key<T, K>(f: impl Fn(&T) -> K) -> impl Fn(T) -> (K, T) {
1602             move |x| (f(&x), x)
1603         }
1604 
1605         fn max_key<T, K: Ord>(a: (K, T), b: (K, T)) -> (K, T) {
1606             match (a.0).cmp(&b.0) {
1607                 Ordering::Greater => a,
1608                 _ => b,
1609             }
1610         }
1611 
1612         let (_, x) = self.map(key(f)).reduce_with(max_key)?;
1613         Some(x)
1614     }
1615 
1616     /// Takes two iterators and creates a new iterator over both.
1617     ///
1618     /// # Examples
1619     ///
1620     /// ```
1621     /// use rayon::prelude::*;
1622     ///
1623     /// let a = [0, 1, 2];
1624     /// let b = [9, 8, 7];
1625     ///
1626     /// let par_iter = a.par_iter().chain(b.par_iter());
1627     ///
1628     /// let chained: Vec<_> = par_iter.cloned().collect();
1629     ///
1630     /// assert_eq!(&chained[..], &[0, 1, 2, 9, 8, 7]);
1631     /// ```
chain<C>(self, chain: C) -> Chain<Self, C::Iter> where C: IntoParallelIterator<Item = Self::Item>,1632     fn chain<C>(self, chain: C) -> Chain<Self, C::Iter>
1633     where
1634         C: IntoParallelIterator<Item = Self::Item>,
1635     {
1636         Chain::new(self, chain.into_par_iter())
1637     }
1638 
1639     /// Searches for **some** item in the parallel iterator that
1640     /// matches the given predicate and returns it. This operation
1641     /// is similar to [`find` on sequential iterators][find] but
1642     /// the item returned may not be the **first** one in the parallel
1643     /// sequence which matches, since we search the entire sequence in parallel.
1644     ///
1645     /// Once a match is found, we will attempt to stop processing
1646     /// the rest of the items in the iterator as soon as possible
1647     /// (just as `find` stops iterating once a match is found).
1648     ///
1649     /// [find]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.find
1650     ///
1651     /// # Examples
1652     ///
1653     /// ```
1654     /// use rayon::prelude::*;
1655     ///
1656     /// let a = [1, 2, 3, 3];
1657     ///
1658     /// assert_eq!(a.par_iter().find_any(|&&x| x == 3), Some(&3));
1659     ///
1660     /// assert_eq!(a.par_iter().find_any(|&&x| x == 100), None);
1661     /// ```
find_any<P>(self, predicate: P) -> Option<Self::Item> where P: Fn(&Self::Item) -> bool + Sync + Send,1662     fn find_any<P>(self, predicate: P) -> Option<Self::Item>
1663     where
1664         P: Fn(&Self::Item) -> bool + Sync + Send,
1665     {
1666         find::find(self, predicate)
1667     }
1668 
1669     /// Searches for the sequentially **first** item in the parallel iterator
1670     /// that matches the given predicate and returns it.
1671     ///
1672     /// Once a match is found, all attempts to the right of the match
1673     /// will be stopped, while attempts to the left must continue in case
1674     /// an earlier match is found.
1675     ///
1676     /// Note that not all parallel iterators have a useful order, much like
1677     /// sequential `HashMap` iteration, so "first" may be nebulous.  If you
1678     /// just want the first match that discovered anywhere in the iterator,
1679     /// `find_any` is a better choice.
1680     ///
1681     /// # Examples
1682     ///
1683     /// ```
1684     /// use rayon::prelude::*;
1685     ///
1686     /// let a = [1, 2, 3, 3];
1687     ///
1688     /// assert_eq!(a.par_iter().find_first(|&&x| x == 3), Some(&3));
1689     ///
1690     /// assert_eq!(a.par_iter().find_first(|&&x| x == 100), None);
1691     /// ```
find_first<P>(self, predicate: P) -> Option<Self::Item> where P: Fn(&Self::Item) -> bool + Sync + Send,1692     fn find_first<P>(self, predicate: P) -> Option<Self::Item>
1693     where
1694         P: Fn(&Self::Item) -> bool + Sync + Send,
1695     {
1696         find_first_last::find_first(self, predicate)
1697     }
1698 
1699     /// Searches for the sequentially **last** item in the parallel iterator
1700     /// that matches the given predicate and returns it.
1701     ///
1702     /// Once a match is found, all attempts to the left of the match
1703     /// will be stopped, while attempts to the right must continue in case
1704     /// a later match is found.
1705     ///
1706     /// Note that not all parallel iterators have a useful order, much like
1707     /// sequential `HashMap` iteration, so "last" may be nebulous.  When the
1708     /// order doesn't actually matter to you, `find_any` is a better choice.
1709     ///
1710     /// # Examples
1711     ///
1712     /// ```
1713     /// use rayon::prelude::*;
1714     ///
1715     /// let a = [1, 2, 3, 3];
1716     ///
1717     /// assert_eq!(a.par_iter().find_last(|&&x| x == 3), Some(&3));
1718     ///
1719     /// assert_eq!(a.par_iter().find_last(|&&x| x == 100), None);
1720     /// ```
find_last<P>(self, predicate: P) -> Option<Self::Item> where P: Fn(&Self::Item) -> bool + Sync + Send,1721     fn find_last<P>(self, predicate: P) -> Option<Self::Item>
1722     where
1723         P: Fn(&Self::Item) -> bool + Sync + Send,
1724     {
1725         find_first_last::find_last(self, predicate)
1726     }
1727 
1728     /// Applies the given predicate to the items in the parallel iterator
1729     /// and returns **any** non-None result of the map operation.
1730     ///
1731     /// Once a non-None value is produced from the map operation, we will
1732     /// attempt to stop processing the rest of the items in the iterator
1733     /// as soon as possible.
1734     ///
1735     /// Note that this method only returns **some** item in the parallel
1736     /// iterator that is not None from the map predicate. The item returned
1737     /// may not be the **first** non-None value produced in the parallel
1738     /// sequence, since the entire sequence is mapped over in parallel.
1739     ///
1740     /// # Examples
1741     ///
1742     /// ```
1743     /// use rayon::prelude::*;
1744     ///
1745     /// let c = ["lol", "NaN", "5", "5"];
1746     ///
1747     /// let found_number = c.par_iter().find_map_any(|s| s.parse().ok());
1748     ///
1749     /// assert_eq!(found_number, Some(5));
1750     /// ```
find_map_any<P, R>(self, predicate: P) -> Option<R> where P: Fn(Self::Item) -> Option<R> + Sync + Send, R: Send,1751     fn find_map_any<P, R>(self, predicate: P) -> Option<R>
1752     where
1753         P: Fn(Self::Item) -> Option<R> + Sync + Send,
1754         R: Send,
1755     {
1756         fn yes<T>(_: &T) -> bool {
1757             true
1758         }
1759         self.filter_map(predicate).find_any(yes)
1760     }
1761 
1762     /// Applies the given predicate to the items in the parallel iterator and
1763     /// returns the sequentially **first** non-None result of the map operation.
1764     ///
1765     /// Once a non-None value is produced from the map operation, all attempts
1766     /// to the right of the match will be stopped, while attempts to the left
1767     /// must continue in case an earlier match is found.
1768     ///
1769     /// Note that not all parallel iterators have a useful order, much like
1770     /// sequential `HashMap` iteration, so "first" may be nebulous. If you
1771     /// just want the first non-None value discovered anywhere in the iterator,
1772     /// `find_map_any` is a better choice.
1773     ///
1774     /// # Examples
1775     ///
1776     /// ```
1777     /// use rayon::prelude::*;
1778     ///
1779     /// let c = ["lol", "NaN", "2", "5"];
1780     ///
1781     /// let first_number = c.par_iter().find_map_first(|s| s.parse().ok());
1782     ///
1783     /// assert_eq!(first_number, Some(2));
1784     /// ```
find_map_first<P, R>(self, predicate: P) -> Option<R> where P: Fn(Self::Item) -> Option<R> + Sync + Send, R: Send,1785     fn find_map_first<P, R>(self, predicate: P) -> Option<R>
1786     where
1787         P: Fn(Self::Item) -> Option<R> + Sync + Send,
1788         R: Send,
1789     {
1790         fn yes<T>(_: &T) -> bool {
1791             true
1792         }
1793         self.filter_map(predicate).find_first(yes)
1794     }
1795 
1796     /// Applies the given predicate to the items in the parallel iterator and
1797     /// returns the sequentially **last** non-None result of the map operation.
1798     ///
1799     /// Once a non-None value is produced from the map operation, all attempts
1800     /// to the left of the match will be stopped, while attempts to the right
1801     /// must continue in case a later match is found.
1802     ///
1803     /// Note that not all parallel iterators have a useful order, much like
1804     /// sequential `HashMap` iteration, so "first" may be nebulous. If you
1805     /// just want the first non-None value discovered anywhere in the iterator,
1806     /// `find_map_any` is a better choice.
1807     ///
1808     /// # Examples
1809     ///
1810     /// ```
1811     /// use rayon::prelude::*;
1812     ///
1813     /// let c = ["lol", "NaN", "2", "5"];
1814     ///
1815     /// let last_number = c.par_iter().find_map_last(|s| s.parse().ok());
1816     ///
1817     /// assert_eq!(last_number, Some(5));
1818     /// ```
find_map_last<P, R>(self, predicate: P) -> Option<R> where P: Fn(Self::Item) -> Option<R> + Sync + Send, R: Send,1819     fn find_map_last<P, R>(self, predicate: P) -> Option<R>
1820     where
1821         P: Fn(Self::Item) -> Option<R> + Sync + Send,
1822         R: Send,
1823     {
1824         fn yes<T>(_: &T) -> bool {
1825             true
1826         }
1827         self.filter_map(predicate).find_last(yes)
1828     }
1829 
1830     #[doc(hidden)]
1831     #[deprecated(note = "parallel `find` does not search in order -- use `find_any`, \\
1832                          `find_first`, or `find_last`")]
find<P>(self, predicate: P) -> Option<Self::Item> where P: Fn(&Self::Item) -> bool + Sync + Send,1833     fn find<P>(self, predicate: P) -> Option<Self::Item>
1834     where
1835         P: Fn(&Self::Item) -> bool + Sync + Send,
1836     {
1837         self.find_any(predicate)
1838     }
1839 
1840     /// Searches for **some** item in the parallel iterator that
1841     /// matches the given predicate, and if so returns true.  Once
1842     /// a match is found, we'll attempt to stop process the rest
1843     /// of the items.  Proving that there's no match, returning false,
1844     /// does require visiting every item.
1845     ///
1846     /// # Examples
1847     ///
1848     /// ```
1849     /// use rayon::prelude::*;
1850     ///
1851     /// let a = [0, 12, 3, 4, 0, 23, 0];
1852     ///
1853     /// let is_valid = a.par_iter().any(|&x| x > 10);
1854     ///
1855     /// assert!(is_valid);
1856     /// ```
any<P>(self, predicate: P) -> bool where P: Fn(Self::Item) -> bool + Sync + Send,1857     fn any<P>(self, predicate: P) -> bool
1858     where
1859         P: Fn(Self::Item) -> bool + Sync + Send,
1860     {
1861         self.map(predicate).find_any(bool::clone).is_some()
1862     }
1863 
1864     /// Tests that every item in the parallel iterator matches the given
1865     /// predicate, and if so returns true.  If a counter-example is found,
1866     /// we'll attempt to stop processing more items, then return false.
1867     ///
1868     /// # Examples
1869     ///
1870     /// ```
1871     /// use rayon::prelude::*;
1872     ///
1873     /// let a = [0, 12, 3, 4, 0, 23, 0];
1874     ///
1875     /// let is_valid = a.par_iter().all(|&x| x > 10);
1876     ///
1877     /// assert!(!is_valid);
1878     /// ```
all<P>(self, predicate: P) -> bool where P: Fn(Self::Item) -> bool + Sync + Send,1879     fn all<P>(self, predicate: P) -> bool
1880     where
1881         P: Fn(Self::Item) -> bool + Sync + Send,
1882     {
1883         #[inline]
1884         fn is_false(x: &bool) -> bool {
1885             !x
1886         }
1887 
1888         self.map(predicate).find_any(is_false).is_none()
1889     }
1890 
1891     /// Creates an iterator over the `Some` items of this iterator, halting
1892     /// as soon as any `None` is found.
1893     ///
1894     /// # Examples
1895     ///
1896     /// ```
1897     /// use rayon::prelude::*;
1898     /// use std::sync::atomic::{AtomicUsize, Ordering};
1899     ///
1900     /// let counter = AtomicUsize::new(0);
1901     /// let value = (0_i32..2048)
1902     ///     .into_par_iter()
1903     ///     .map(|x| {
1904     ///              counter.fetch_add(1, Ordering::SeqCst);
1905     ///              if x < 1024 { Some(x) } else { None }
1906     ///          })
1907     ///     .while_some()
1908     ///     .max();
1909     ///
1910     /// assert!(value < Some(1024));
1911     /// assert!(counter.load(Ordering::SeqCst) < 2048); // should not have visited every single one
1912     /// ```
while_some<T>(self) -> WhileSome<Self> where Self: ParallelIterator<Item = Option<T>>, T: Send,1913     fn while_some<T>(self) -> WhileSome<Self>
1914     where
1915         Self: ParallelIterator<Item = Option<T>>,
1916         T: Send,
1917     {
1918         WhileSome::new(self)
1919     }
1920 
1921     /// Wraps an iterator with a fuse in case of panics, to halt all threads
1922     /// as soon as possible.
1923     ///
1924     /// Panics within parallel iterators are always propagated to the caller,
1925     /// but they don't always halt the rest of the iterator right away, due to
1926     /// the internal semantics of [`join`]. This adaptor makes a greater effort
1927     /// to stop processing other items sooner, with the cost of additional
1928     /// synchronization overhead, which may also inhibit some optimizations.
1929     ///
1930     /// [`join`]: ../fn.join.html#panics
1931     ///
1932     /// # Examples
1933     ///
1934     /// If this code didn't use `panic_fuse()`, it would continue processing
1935     /// many more items in other threads (with long sleep delays) before the
1936     /// panic is finally propagated.
1937     ///
1938     /// ```should_panic
1939     /// use rayon::prelude::*;
1940     /// use std::{thread, time};
1941     ///
1942     /// (0..1_000_000)
1943     ///     .into_par_iter()
1944     ///     .panic_fuse()
1945     ///     .for_each(|i| {
1946     ///         // simulate some work
1947     ///         thread::sleep(time::Duration::from_secs(1));
1948     ///         assert!(i > 0); // oops!
1949     ///     });
1950     /// ```
panic_fuse(self) -> PanicFuse<Self>1951     fn panic_fuse(self) -> PanicFuse<Self> {
1952         PanicFuse::new(self)
1953     }
1954 
1955     /// Creates a fresh collection containing all the elements produced
1956     /// by this parallel iterator.
1957     ///
1958     /// You may prefer [`collect_into_vec()`] implemented on
1959     /// [`IndexedParallelIterator`], if your underlying iterator also implements
1960     /// it. [`collect_into_vec()`] allocates efficiently with precise knowledge
1961     /// of how many elements the iterator contains, and even allows you to reuse
1962     /// an existing vector's backing store rather than allocating a fresh vector.
1963     ///
1964     /// [`IndexedParallelIterator`]: trait.IndexedParallelIterator.html
1965     /// [`collect_into_vec()`]:
1966     ///     trait.IndexedParallelIterator.html#method.collect_into_vec
1967     ///
1968     /// # Examples
1969     ///
1970     /// ```
1971     /// use rayon::prelude::*;
1972     ///
1973     /// let sync_vec: Vec<_> = (0..100).into_iter().collect();
1974     ///
1975     /// let async_vec: Vec<_> = (0..100).into_par_iter().collect();
1976     ///
1977     /// assert_eq!(sync_vec, async_vec);
1978     /// ```
1979     ///
1980     /// You can collect a pair of collections like [`unzip`](#method.unzip)
1981     /// for paired items:
1982     ///
1983     /// ```
1984     /// use rayon::prelude::*;
1985     ///
1986     /// let a = [(0, 1), (1, 2), (2, 3), (3, 4)];
1987     /// let (first, second): (Vec<_>, Vec<_>) = a.into_par_iter().collect();
1988     ///
1989     /// assert_eq!(first, [0, 1, 2, 3]);
1990     /// assert_eq!(second, [1, 2, 3, 4]);
1991     /// ```
1992     ///
1993     /// Or like [`partition_map`](#method.partition_map) for `Either` items:
1994     ///
1995     /// ```
1996     /// use rayon::prelude::*;
1997     /// use rayon::iter::Either;
1998     ///
1999     /// let (left, right): (Vec<_>, Vec<_>) = (0..8).into_par_iter().map(|x| {
2000     ///     if x % 2 == 0 {
2001     ///         Either::Left(x * 4)
2002     ///     } else {
2003     ///         Either::Right(x * 3)
2004     ///     }
2005     /// }).collect();
2006     ///
2007     /// assert_eq!(left, [0, 8, 16, 24]);
2008     /// assert_eq!(right, [3, 9, 15, 21]);
2009     /// ```
2010     ///
2011     /// You can even collect an arbitrarily-nested combination of pairs and `Either`:
2012     ///
2013     /// ```
2014     /// use rayon::prelude::*;
2015     /// use rayon::iter::Either;
2016     ///
2017     /// let (first, (left, right)): (Vec<_>, (Vec<_>, Vec<_>))
2018     ///     = (0..8).into_par_iter().map(|x| {
2019     ///         if x % 2 == 0 {
2020     ///             (x, Either::Left(x * 4))
2021     ///         } else {
2022     ///             (-x, Either::Right(x * 3))
2023     ///         }
2024     ///     }).collect();
2025     ///
2026     /// assert_eq!(first, [0, -1, 2, -3, 4, -5, 6, -7]);
2027     /// assert_eq!(left, [0, 8, 16, 24]);
2028     /// assert_eq!(right, [3, 9, 15, 21]);
2029     /// ```
2030     ///
2031     /// All of that can _also_ be combined with short-circuiting collection of
2032     /// `Result` or `Option` types:
2033     ///
2034     /// ```
2035     /// use rayon::prelude::*;
2036     /// use rayon::iter::Either;
2037     ///
2038     /// let result: Result<(Vec<_>, (Vec<_>, Vec<_>)), _>
2039     ///     = (0..8).into_par_iter().map(|x| {
2040     ///         if x > 5 {
2041     ///             Err(x)
2042     ///         } else if x % 2 == 0 {
2043     ///             Ok((x, Either::Left(x * 4)))
2044     ///         } else {
2045     ///             Ok((-x, Either::Right(x * 3)))
2046     ///         }
2047     ///     }).collect();
2048     ///
2049     /// let error = result.unwrap_err();
2050     /// assert!(error == 6 || error == 7);
2051     /// ```
collect<C>(self) -> C where C: FromParallelIterator<Self::Item>,2052     fn collect<C>(self) -> C
2053     where
2054         C: FromParallelIterator<Self::Item>,
2055     {
2056         C::from_par_iter(self)
2057     }
2058 
2059     /// Unzips the items of a parallel iterator into a pair of arbitrary
2060     /// `ParallelExtend` containers.
2061     ///
2062     /// You may prefer to use `unzip_into_vecs()`, which allocates more
2063     /// efficiently with precise knowledge of how many elements the
2064     /// iterator contains, and even allows you to reuse existing
2065     /// vectors' backing stores rather than allocating fresh vectors.
2066     ///
2067     /// # Examples
2068     ///
2069     /// ```
2070     /// use rayon::prelude::*;
2071     ///
2072     /// let a = [(0, 1), (1, 2), (2, 3), (3, 4)];
2073     ///
2074     /// let (left, right): (Vec<_>, Vec<_>) = a.par_iter().cloned().unzip();
2075     ///
2076     /// assert_eq!(left, [0, 1, 2, 3]);
2077     /// assert_eq!(right, [1, 2, 3, 4]);
2078     /// ```
2079     ///
2080     /// Nested pairs can be unzipped too.
2081     ///
2082     /// ```
2083     /// use rayon::prelude::*;
2084     ///
2085     /// let (values, (squares, cubes)): (Vec<_>, (Vec<_>, Vec<_>)) = (0..4).into_par_iter()
2086     ///     .map(|i| (i, (i * i, i * i * i)))
2087     ///     .unzip();
2088     ///
2089     /// assert_eq!(values, [0, 1, 2, 3]);
2090     /// assert_eq!(squares, [0, 1, 4, 9]);
2091     /// assert_eq!(cubes, [0, 1, 8, 27]);
2092     /// ```
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,2093     fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
2094     where
2095         Self: ParallelIterator<Item = (A, B)>,
2096         FromA: Default + Send + ParallelExtend<A>,
2097         FromB: Default + Send + ParallelExtend<B>,
2098         A: Send,
2099         B: Send,
2100     {
2101         unzip::unzip(self)
2102     }
2103 
2104     /// Partitions the items of a parallel iterator into a pair of arbitrary
2105     /// `ParallelExtend` containers.  Items for which the `predicate` returns
2106     /// true go into the first container, and the rest go into the second.
2107     ///
2108     /// Note: unlike the standard `Iterator::partition`, this allows distinct
2109     /// collection types for the left and right items.  This is more flexible,
2110     /// but may require new type annotations when converting sequential code
2111     /// that used type inference assuming the two were the same.
2112     ///
2113     /// # Examples
2114     ///
2115     /// ```
2116     /// use rayon::prelude::*;
2117     ///
2118     /// let (left, right): (Vec<_>, Vec<_>) = (0..8).into_par_iter().partition(|x| x % 2 == 0);
2119     ///
2120     /// assert_eq!(left, [0, 2, 4, 6]);
2121     /// assert_eq!(right, [1, 3, 5, 7]);
2122     /// ```
partition<A, B, P>(self, predicate: P) -> (A, B) where A: Default + Send + ParallelExtend<Self::Item>, B: Default + Send + ParallelExtend<Self::Item>, P: Fn(&Self::Item) -> bool + Sync + Send,2123     fn partition<A, B, P>(self, predicate: P) -> (A, B)
2124     where
2125         A: Default + Send + ParallelExtend<Self::Item>,
2126         B: Default + Send + ParallelExtend<Self::Item>,
2127         P: Fn(&Self::Item) -> bool + Sync + Send,
2128     {
2129         unzip::partition(self, predicate)
2130     }
2131 
2132     /// Partitions and maps the items of a parallel iterator into a pair of
2133     /// arbitrary `ParallelExtend` containers.  `Either::Left` items go into
2134     /// the first container, and `Either::Right` items go into the second.
2135     ///
2136     /// # Examples
2137     ///
2138     /// ```
2139     /// use rayon::prelude::*;
2140     /// use rayon::iter::Either;
2141     ///
2142     /// let (left, right): (Vec<_>, Vec<_>) = (0..8).into_par_iter()
2143     ///     .partition_map(|x| {
2144     ///         if x % 2 == 0 {
2145     ///             Either::Left(x * 4)
2146     ///         } else {
2147     ///             Either::Right(x * 3)
2148     ///         }
2149     ///     });
2150     ///
2151     /// assert_eq!(left, [0, 8, 16, 24]);
2152     /// assert_eq!(right, [3, 9, 15, 21]);
2153     /// ```
2154     ///
2155     /// Nested `Either` enums can be split as well.
2156     ///
2157     /// ```
2158     /// use rayon::prelude::*;
2159     /// use rayon::iter::Either::*;
2160     ///
2161     /// let ((fizzbuzz, fizz), (buzz, other)): ((Vec<_>, Vec<_>), (Vec<_>, Vec<_>)) = (1..20)
2162     ///     .into_par_iter()
2163     ///     .partition_map(|x| match (x % 3, x % 5) {
2164     ///         (0, 0) => Left(Left(x)),
2165     ///         (0, _) => Left(Right(x)),
2166     ///         (_, 0) => Right(Left(x)),
2167     ///         (_, _) => Right(Right(x)),
2168     ///     });
2169     ///
2170     /// assert_eq!(fizzbuzz, [15]);
2171     /// assert_eq!(fizz, [3, 6, 9, 12, 18]);
2172     /// assert_eq!(buzz, [5, 10]);
2173     /// assert_eq!(other, [1, 2, 4, 7, 8, 11, 13, 14, 16, 17, 19]);
2174     /// ```
partition_map<A, B, P, L, R>(self, predicate: P) -> (A, B) where A: Default + Send + ParallelExtend<L>, B: Default + Send + ParallelExtend<R>, P: Fn(Self::Item) -> Either<L, R> + Sync + Send, L: Send, R: Send,2175     fn partition_map<A, B, P, L, R>(self, predicate: P) -> (A, B)
2176     where
2177         A: Default + Send + ParallelExtend<L>,
2178         B: Default + Send + ParallelExtend<R>,
2179         P: Fn(Self::Item) -> Either<L, R> + Sync + Send,
2180         L: Send,
2181         R: Send,
2182     {
2183         unzip::partition_map(self, predicate)
2184     }
2185 
2186     /// Intersperses clones of an element between items of this iterator.
2187     ///
2188     /// # Examples
2189     ///
2190     /// ```
2191     /// use rayon::prelude::*;
2192     ///
2193     /// let x = vec![1, 2, 3];
2194     /// let r: Vec<_> = x.into_par_iter().intersperse(-1).collect();
2195     ///
2196     /// assert_eq!(r, vec![1, -1, 2, -1, 3]);
2197     /// ```
intersperse(self, element: Self::Item) -> Intersperse<Self> where Self::Item: Clone,2198     fn intersperse(self, element: Self::Item) -> Intersperse<Self>
2199     where
2200         Self::Item: Clone,
2201     {
2202         Intersperse::new(self, element)
2203     }
2204 
2205     /// Creates an iterator that yields `n` elements from *anywhere* in the original iterator.
2206     ///
2207     /// This is similar to [`IndexedParallelIterator::take`] without being
2208     /// constrained to the "first" `n` of the original iterator order. The
2209     /// taken items will still maintain their relative order where that is
2210     /// visible in `collect`, `reduce`, and similar outputs.
2211     ///
2212     /// # Examples
2213     ///
2214     /// ```
2215     /// use rayon::prelude::*;
2216     ///
2217     /// let result: Vec<_> = (0..100)
2218     ///     .into_par_iter()
2219     ///     .filter(|&x| x % 2 == 0)
2220     ///     .take_any(5)
2221     ///     .collect();
2222     ///
2223     /// assert_eq!(result.len(), 5);
2224     /// assert!(result.windows(2).all(|w| w[0] < w[1]));
2225     /// ```
take_any(self, n: usize) -> TakeAny<Self>2226     fn take_any(self, n: usize) -> TakeAny<Self> {
2227         TakeAny::new(self, n)
2228     }
2229 
2230     /// Creates an iterator that skips `n` elements from *anywhere* in the original iterator.
2231     ///
2232     /// This is similar to [`IndexedParallelIterator::skip`] without being
2233     /// constrained to the "first" `n` of the original iterator order. The
2234     /// remaining items will still maintain their relative order where that is
2235     /// visible in `collect`, `reduce`, and similar outputs.
2236     ///
2237     /// # Examples
2238     ///
2239     /// ```
2240     /// use rayon::prelude::*;
2241     ///
2242     /// let result: Vec<_> = (0..100)
2243     ///     .into_par_iter()
2244     ///     .filter(|&x| x % 2 == 0)
2245     ///     .skip_any(5)
2246     ///     .collect();
2247     ///
2248     /// assert_eq!(result.len(), 45);
2249     /// assert!(result.windows(2).all(|w| w[0] < w[1]));
2250     /// ```
skip_any(self, n: usize) -> SkipAny<Self>2251     fn skip_any(self, n: usize) -> SkipAny<Self> {
2252         SkipAny::new(self, n)
2253     }
2254 
2255     /// Creates an iterator that takes elements from *anywhere* in the original iterator
2256     /// until the given `predicate` returns `false`.
2257     ///
2258     /// The `predicate` may be anything -- e.g. it could be checking a fact about the item, a
2259     /// global condition unrelated to the item itself, or some combination thereof.
2260     ///
2261     /// If parallel calls to the `predicate` race and give different results, then the
2262     /// `true` results will still take those particular items, while respecting the `false`
2263     /// result from elsewhere to skip any further items.
2264     ///
2265     /// This is similar to [`Iterator::take_while`] without being constrained to the original
2266     /// iterator order. The taken items will still maintain their relative order where that is
2267     /// visible in `collect`, `reduce`, and similar outputs.
2268     ///
2269     /// # Examples
2270     ///
2271     /// ```
2272     /// use rayon::prelude::*;
2273     ///
2274     /// let result: Vec<_> = (0..100)
2275     ///     .into_par_iter()
2276     ///     .take_any_while(|x| *x < 50)
2277     ///     .collect();
2278     ///
2279     /// assert!(result.len() <= 50);
2280     /// assert!(result.windows(2).all(|w| w[0] < w[1]));
2281     /// ```
2282     ///
2283     /// ```
2284     /// use rayon::prelude::*;
2285     /// use std::sync::atomic::AtomicUsize;
2286     /// use std::sync::atomic::Ordering::Relaxed;
2287     ///
2288     /// // Collect any group of items that sum <= 1000
2289     /// let quota = AtomicUsize::new(1000);
2290     /// let result: Vec<_> = (0_usize..100)
2291     ///     .into_par_iter()
2292     ///     .take_any_while(|&x| {
2293     ///         quota.fetch_update(Relaxed, Relaxed, |q| q.checked_sub(x))
2294     ///             .is_ok()
2295     ///     })
2296     ///     .collect();
2297     ///
2298     /// let sum = result.iter().sum::<usize>();
2299     /// assert!(matches!(sum, 902..=1000));
2300     /// ```
take_any_while<P>(self, predicate: P) -> TakeAnyWhile<Self, P> where P: Fn(&Self::Item) -> bool + Sync + Send,2301     fn take_any_while<P>(self, predicate: P) -> TakeAnyWhile<Self, P>
2302     where
2303         P: Fn(&Self::Item) -> bool + Sync + Send,
2304     {
2305         TakeAnyWhile::new(self, predicate)
2306     }
2307 
2308     /// Creates an iterator that skips elements from *anywhere* in the original iterator
2309     /// until the given `predicate` returns `false`.
2310     ///
2311     /// The `predicate` may be anything -- e.g. it could be checking a fact about the item, a
2312     /// global condition unrelated to the item itself, or some combination thereof.
2313     ///
2314     /// If parallel calls to the `predicate` race and give different results, then the
2315     /// `true` results will still skip those particular items, while respecting the `false`
2316     /// result from elsewhere to skip any further items.
2317     ///
2318     /// This is similar to [`Iterator::skip_while`] without being constrained to the original
2319     /// iterator order. The remaining items will still maintain their relative order where that is
2320     /// visible in `collect`, `reduce`, and similar outputs.
2321     ///
2322     /// # Examples
2323     ///
2324     /// ```
2325     /// use rayon::prelude::*;
2326     ///
2327     /// let result: Vec<_> = (0..100)
2328     ///     .into_par_iter()
2329     ///     .skip_any_while(|x| *x < 50)
2330     ///     .collect();
2331     ///
2332     /// assert!(result.len() >= 50);
2333     /// assert!(result.windows(2).all(|w| w[0] < w[1]));
2334     /// ```
skip_any_while<P>(self, predicate: P) -> SkipAnyWhile<Self, P> where P: Fn(&Self::Item) -> bool + Sync + Send,2335     fn skip_any_while<P>(self, predicate: P) -> SkipAnyWhile<Self, P>
2336     where
2337         P: Fn(&Self::Item) -> bool + Sync + Send,
2338     {
2339         SkipAnyWhile::new(self, predicate)
2340     }
2341 
2342     /// Internal method used to define the behavior of this parallel
2343     /// iterator. You should not need to call this directly.
2344     ///
2345     /// This method causes the iterator `self` to start producing
2346     /// items and to feed them to the consumer `consumer` one by one.
2347     /// It may split the consumer before doing so to create the
2348     /// opportunity to produce in parallel.
2349     ///
2350     /// See the [README] for more details on the internals of parallel
2351     /// iterators.
2352     ///
2353     /// [README]: https://github.com/rayon-rs/rayon/blob/master/src/iter/plumbing/README.md
drive_unindexed<C>(self, consumer: C) -> C::Result where C: UnindexedConsumer<Self::Item>2354     fn drive_unindexed<C>(self, consumer: C) -> C::Result
2355     where
2356         C: UnindexedConsumer<Self::Item>;
2357 
2358     /// Internal method used to define the behavior of this parallel
2359     /// iterator. You should not need to call this directly.
2360     ///
2361     /// Returns the number of items produced by this iterator, if known
2362     /// statically. This can be used by consumers to trigger special fast
2363     /// paths. Therefore, if `Some(_)` is returned, this iterator must only
2364     /// use the (indexed) `Consumer` methods when driving a consumer, such
2365     /// as `split_at()`. Calling `UnindexedConsumer::split_off_left()` or
2366     /// other `UnindexedConsumer` methods -- or returning an inaccurate
2367     /// value -- may result in panics.
2368     ///
2369     /// This method is currently used to optimize `collect` for want
2370     /// of true Rust specialization; it may be removed when
2371     /// specialization is stable.
opt_len(&self) -> Option<usize>2372     fn opt_len(&self) -> Option<usize> {
2373         None
2374     }
2375 }
2376 
2377 impl<T: ParallelIterator> IntoParallelIterator for T {
2378     type Iter = T;
2379     type Item = T::Item;
2380 
into_par_iter(self) -> T2381     fn into_par_iter(self) -> T {
2382         self
2383     }
2384 }
2385 
2386 /// An iterator that supports "random access" to its data, meaning
2387 /// that you can split it at arbitrary indices and draw data from
2388 /// those points.
2389 ///
2390 /// **Note:** Not implemented for `u64`, `i64`, `u128`, or `i128` ranges
2391 // Waiting for `ExactSizeIterator::is_empty` to be stabilized. See rust-lang/rust#35428
2392 #[allow(clippy::len_without_is_empty)]
2393 pub trait IndexedParallelIterator: ParallelIterator {
2394     /// Collects the results of the iterator into the specified
2395     /// vector. The vector is always cleared before execution
2396     /// begins. If possible, reusing the vector across calls can lead
2397     /// to better performance since it reuses the same backing buffer.
2398     ///
2399     /// # Examples
2400     ///
2401     /// ```
2402     /// use rayon::prelude::*;
2403     ///
2404     /// // any prior data will be cleared
2405     /// let mut vec = vec![-1, -2, -3];
2406     ///
2407     /// (0..5).into_par_iter()
2408     ///     .collect_into_vec(&mut vec);
2409     ///
2410     /// assert_eq!(vec, [0, 1, 2, 3, 4]);
2411     /// ```
collect_into_vec(self, target: &mut Vec<Self::Item>)2412     fn collect_into_vec(self, target: &mut Vec<Self::Item>) {
2413         collect::collect_into_vec(self, target);
2414     }
2415 
2416     /// Unzips the results of the iterator into the specified
2417     /// vectors. The vectors are always cleared before execution
2418     /// begins. If possible, reusing the vectors across calls can lead
2419     /// to better performance since they reuse the same backing buffer.
2420     ///
2421     /// # Examples
2422     ///
2423     /// ```
2424     /// use rayon::prelude::*;
2425     ///
2426     /// // any prior data will be cleared
2427     /// let mut left = vec![42; 10];
2428     /// let mut right = vec![-1; 10];
2429     ///
2430     /// (10..15).into_par_iter()
2431     ///     .enumerate()
2432     ///     .unzip_into_vecs(&mut left, &mut right);
2433     ///
2434     /// assert_eq!(left, [0, 1, 2, 3, 4]);
2435     /// assert_eq!(right, [10, 11, 12, 13, 14]);
2436     /// ```
unzip_into_vecs<A, B>(self, left: &mut Vec<A>, right: &mut Vec<B>) where Self: IndexedParallelIterator<Item = (A, B)>, A: Send, B: Send,2437     fn unzip_into_vecs<A, B>(self, left: &mut Vec<A>, right: &mut Vec<B>)
2438     where
2439         Self: IndexedParallelIterator<Item = (A, B)>,
2440         A: Send,
2441         B: Send,
2442     {
2443         collect::unzip_into_vecs(self, left, right);
2444     }
2445 
2446     /// Iterates over tuples `(A, B)`, where the items `A` are from
2447     /// this iterator and `B` are from the iterator given as argument.
2448     /// Like the `zip` method on ordinary iterators, if the two
2449     /// iterators are of unequal length, you only get the items they
2450     /// have in common.
2451     ///
2452     /// # Examples
2453     ///
2454     /// ```
2455     /// use rayon::prelude::*;
2456     ///
2457     /// let result: Vec<_> = (1..4)
2458     ///     .into_par_iter()
2459     ///     .zip(vec!['a', 'b', 'c'])
2460     ///     .collect();
2461     ///
2462     /// assert_eq!(result, [(1, 'a'), (2, 'b'), (3, 'c')]);
2463     /// ```
zip<Z>(self, zip_op: Z) -> Zip<Self, Z::Iter> where Z: IntoParallelIterator, Z::Iter: IndexedParallelIterator,2464     fn zip<Z>(self, zip_op: Z) -> Zip<Self, Z::Iter>
2465     where
2466         Z: IntoParallelIterator,
2467         Z::Iter: IndexedParallelIterator,
2468     {
2469         Zip::new(self, zip_op.into_par_iter())
2470     }
2471 
2472     /// The same as `Zip`, but requires that both iterators have the same length.
2473     ///
2474     /// # Panics
2475     /// Will panic if `self` and `zip_op` are not the same length.
2476     ///
2477     /// ```should_panic
2478     /// use rayon::prelude::*;
2479     ///
2480     /// let one = [1u8];
2481     /// let two = [2u8, 2];
2482     /// let one_iter = one.par_iter();
2483     /// let two_iter = two.par_iter();
2484     ///
2485     /// // this will panic
2486     /// let zipped: Vec<(&u8, &u8)> = one_iter.zip_eq(two_iter).collect();
2487     ///
2488     /// // we should never get here
2489     /// assert_eq!(1, zipped.len());
2490     /// ```
2491     #[track_caller]
zip_eq<Z>(self, zip_op: Z) -> ZipEq<Self, Z::Iter> where Z: IntoParallelIterator, Z::Iter: IndexedParallelIterator,2492     fn zip_eq<Z>(self, zip_op: Z) -> ZipEq<Self, Z::Iter>
2493     where
2494         Z: IntoParallelIterator,
2495         Z::Iter: IndexedParallelIterator,
2496     {
2497         let zip_op_iter = zip_op.into_par_iter();
2498         assert_eq!(
2499             self.len(),
2500             zip_op_iter.len(),
2501             "iterators must have the same length"
2502         );
2503         ZipEq::new(self, zip_op_iter)
2504     }
2505 
2506     /// Interleaves elements of this iterator and the other given
2507     /// iterator. Alternately yields elements from this iterator and
2508     /// the given iterator, until both are exhausted. If one iterator
2509     /// is exhausted before the other, the last elements are provided
2510     /// from the other.
2511     ///
2512     /// # Examples
2513     ///
2514     /// ```
2515     /// use rayon::prelude::*;
2516     /// let (x, y) = (vec![1, 2], vec![3, 4, 5, 6]);
2517     /// let r: Vec<i32> = x.into_par_iter().interleave(y).collect();
2518     /// assert_eq!(r, vec![1, 3, 2, 4, 5, 6]);
2519     /// ```
interleave<I>(self, other: I) -> Interleave<Self, I::Iter> where I: IntoParallelIterator<Item = Self::Item>, I::Iter: IndexedParallelIterator<Item = Self::Item>,2520     fn interleave<I>(self, other: I) -> Interleave<Self, I::Iter>
2521     where
2522         I: IntoParallelIterator<Item = Self::Item>,
2523         I::Iter: IndexedParallelIterator<Item = Self::Item>,
2524     {
2525         Interleave::new(self, other.into_par_iter())
2526     }
2527 
2528     /// Interleaves elements of this iterator and the other given
2529     /// iterator, until one is exhausted.
2530     ///
2531     /// # Examples
2532     ///
2533     /// ```
2534     /// use rayon::prelude::*;
2535     /// let (x, y) = (vec![1, 2, 3, 4], vec![5, 6]);
2536     /// let r: Vec<i32> = x.into_par_iter().interleave_shortest(y).collect();
2537     /// assert_eq!(r, vec![1, 5, 2, 6, 3]);
2538     /// ```
interleave_shortest<I>(self, other: I) -> InterleaveShortest<Self, I::Iter> where I: IntoParallelIterator<Item = Self::Item>, I::Iter: IndexedParallelIterator<Item = Self::Item>,2539     fn interleave_shortest<I>(self, other: I) -> InterleaveShortest<Self, I::Iter>
2540     where
2541         I: IntoParallelIterator<Item = Self::Item>,
2542         I::Iter: IndexedParallelIterator<Item = Self::Item>,
2543     {
2544         InterleaveShortest::new(self, other.into_par_iter())
2545     }
2546 
2547     /// Splits an iterator up into fixed-size chunks.
2548     ///
2549     /// Returns an iterator that returns `Vec`s of the given number of elements.
2550     /// If the number of elements in the iterator is not divisible by `chunk_size`,
2551     /// the last chunk may be shorter than `chunk_size`.
2552     ///
2553     /// See also [`par_chunks()`] and [`par_chunks_mut()`] for similar behavior on
2554     /// slices, without having to allocate intermediate `Vec`s for the chunks.
2555     ///
2556     /// [`par_chunks()`]: ../slice/trait.ParallelSlice.html#method.par_chunks
2557     /// [`par_chunks_mut()`]: ../slice/trait.ParallelSliceMut.html#method.par_chunks_mut
2558     ///
2559     /// # Examples
2560     ///
2561     /// ```
2562     /// use rayon::prelude::*;
2563     /// let a = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2564     /// let r: Vec<Vec<i32>> = a.into_par_iter().chunks(3).collect();
2565     /// assert_eq!(r, vec![vec![1,2,3], vec![4,5,6], vec![7,8,9], vec![10]]);
2566     /// ```
2567     #[track_caller]
chunks(self, chunk_size: usize) -> Chunks<Self>2568     fn chunks(self, chunk_size: usize) -> Chunks<Self> {
2569         assert!(chunk_size != 0, "chunk_size must not be zero");
2570         Chunks::new(self, chunk_size)
2571     }
2572 
2573     /// Splits an iterator into fixed-size chunks, performing a sequential [`fold()`] on
2574     /// each chunk.
2575     ///
2576     /// Returns an iterator that produces a folded result for each chunk of items
2577     /// produced by this iterator.
2578     ///
2579     /// This works essentially like:
2580     ///
2581     /// ```text
2582     /// iter.chunks(chunk_size)
2583     ///     .map(|chunk|
2584     ///         chunk.into_iter()
2585     ///             .fold(identity, fold_op)
2586     ///     )
2587     /// ```
2588     ///
2589     /// except there is no per-chunk allocation overhead.
2590     ///
2591     /// [`fold()`]: std::iter::Iterator#method.fold
2592     ///
2593     /// **Panics** if `chunk_size` is 0.
2594     ///
2595     /// # Examples
2596     ///
2597     /// ```
2598     /// use rayon::prelude::*;
2599     /// let nums = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2600     /// let chunk_sums = nums.into_par_iter().fold_chunks(2, || 0, |a, n| a + n).collect::<Vec<_>>();
2601     /// assert_eq!(chunk_sums, vec![3, 7, 11, 15, 19]);
2602     /// ```
2603     #[track_caller]
fold_chunks<T, ID, F>( self, chunk_size: usize, identity: ID, fold_op: F, ) -> FoldChunks<Self, ID, F> where ID: Fn() -> T + Send + Sync, F: Fn(T, Self::Item) -> T + Send + Sync, T: Send,2604     fn fold_chunks<T, ID, F>(
2605         self,
2606         chunk_size: usize,
2607         identity: ID,
2608         fold_op: F,
2609     ) -> FoldChunks<Self, ID, F>
2610     where
2611         ID: Fn() -> T + Send + Sync,
2612         F: Fn(T, Self::Item) -> T + Send + Sync,
2613         T: Send,
2614     {
2615         assert!(chunk_size != 0, "chunk_size must not be zero");
2616         FoldChunks::new(self, chunk_size, identity, fold_op)
2617     }
2618 
2619     /// Splits an iterator into fixed-size chunks, performing a sequential [`fold()`] on
2620     /// each chunk.
2621     ///
2622     /// Returns an iterator that produces a folded result for each chunk of items
2623     /// produced by this iterator.
2624     ///
2625     /// This works essentially like `fold_chunks(chunk_size, || init.clone(), fold_op)`,
2626     /// except it doesn't require the `init` type to be `Sync`, nor any other form of
2627     /// added synchronization.
2628     ///
2629     /// [`fold()`]: std::iter::Iterator#method.fold
2630     ///
2631     /// **Panics** if `chunk_size` is 0.
2632     ///
2633     /// # Examples
2634     ///
2635     /// ```
2636     /// use rayon::prelude::*;
2637     /// let nums = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2638     /// let chunk_sums = nums.into_par_iter().fold_chunks_with(2, 0, |a, n| a + n).collect::<Vec<_>>();
2639     /// assert_eq!(chunk_sums, vec![3, 7, 11, 15, 19]);
2640     /// ```
2641     #[track_caller]
fold_chunks_with<T, F>( self, chunk_size: usize, init: T, fold_op: F, ) -> FoldChunksWith<Self, T, F> where T: Send + Clone, F: Fn(T, Self::Item) -> T + Send + Sync,2642     fn fold_chunks_with<T, F>(
2643         self,
2644         chunk_size: usize,
2645         init: T,
2646         fold_op: F,
2647     ) -> FoldChunksWith<Self, T, F>
2648     where
2649         T: Send + Clone,
2650         F: Fn(T, Self::Item) -> T + Send + Sync,
2651     {
2652         assert!(chunk_size != 0, "chunk_size must not be zero");
2653         FoldChunksWith::new(self, chunk_size, init, fold_op)
2654     }
2655 
2656     /// Lexicographically compares the elements of this `ParallelIterator` with those of
2657     /// another.
2658     ///
2659     /// # Examples
2660     ///
2661     /// ```
2662     /// use rayon::prelude::*;
2663     /// use std::cmp::Ordering::*;
2664     ///
2665     /// let x = vec![1, 2, 3];
2666     /// assert_eq!(x.par_iter().cmp(&vec![1, 3, 0]), Less);
2667     /// assert_eq!(x.par_iter().cmp(&vec![1, 2, 3]), Equal);
2668     /// assert_eq!(x.par_iter().cmp(&vec![1, 2]), Greater);
2669     /// ```
cmp<I>(self, other: I) -> Ordering where I: IntoParallelIterator<Item = Self::Item>, I::Iter: IndexedParallelIterator, Self::Item: Ord,2670     fn cmp<I>(self, other: I) -> Ordering
2671     where
2672         I: IntoParallelIterator<Item = Self::Item>,
2673         I::Iter: IndexedParallelIterator,
2674         Self::Item: Ord,
2675     {
2676         #[inline]
2677         fn ordering<T: Ord>((x, y): (T, T)) -> Ordering {
2678             Ord::cmp(&x, &y)
2679         }
2680 
2681         #[inline]
2682         fn inequal(&ord: &Ordering) -> bool {
2683             ord != Ordering::Equal
2684         }
2685 
2686         let other = other.into_par_iter();
2687         let ord_len = self.len().cmp(&other.len());
2688         self.zip(other)
2689             .map(ordering)
2690             .find_first(inequal)
2691             .unwrap_or(ord_len)
2692     }
2693 
2694     /// Lexicographically compares the elements of this `ParallelIterator` with those of
2695     /// another.
2696     ///
2697     /// # Examples
2698     ///
2699     /// ```
2700     /// use rayon::prelude::*;
2701     /// use std::cmp::Ordering::*;
2702     /// use std::f64::NAN;
2703     ///
2704     /// let x = vec![1.0, 2.0, 3.0];
2705     /// assert_eq!(x.par_iter().partial_cmp(&vec![1.0, 3.0, 0.0]), Some(Less));
2706     /// assert_eq!(x.par_iter().partial_cmp(&vec![1.0, 2.0, 3.0]), Some(Equal));
2707     /// assert_eq!(x.par_iter().partial_cmp(&vec![1.0, 2.0]), Some(Greater));
2708     /// assert_eq!(x.par_iter().partial_cmp(&vec![1.0, NAN]), None);
2709     /// ```
partial_cmp<I>(self, other: I) -> Option<Ordering> where I: IntoParallelIterator, I::Iter: IndexedParallelIterator, Self::Item: PartialOrd<I::Item>,2710     fn partial_cmp<I>(self, other: I) -> Option<Ordering>
2711     where
2712         I: IntoParallelIterator,
2713         I::Iter: IndexedParallelIterator,
2714         Self::Item: PartialOrd<I::Item>,
2715     {
2716         #[inline]
2717         fn ordering<T: PartialOrd<U>, U>((x, y): (T, U)) -> Option<Ordering> {
2718             PartialOrd::partial_cmp(&x, &y)
2719         }
2720 
2721         #[inline]
2722         fn inequal(&ord: &Option<Ordering>) -> bool {
2723             ord != Some(Ordering::Equal)
2724         }
2725 
2726         let other = other.into_par_iter();
2727         let ord_len = self.len().cmp(&other.len());
2728         self.zip(other)
2729             .map(ordering)
2730             .find_first(inequal)
2731             .unwrap_or(Some(ord_len))
2732     }
2733 
2734     /// Determines if the elements of this `ParallelIterator`
2735     /// are equal to those of another
eq<I>(self, other: I) -> bool where I: IntoParallelIterator, I::Iter: IndexedParallelIterator, Self::Item: PartialEq<I::Item>,2736     fn eq<I>(self, other: I) -> bool
2737     where
2738         I: IntoParallelIterator,
2739         I::Iter: IndexedParallelIterator,
2740         Self::Item: PartialEq<I::Item>,
2741     {
2742         #[inline]
2743         fn eq<T: PartialEq<U>, U>((x, y): (T, U)) -> bool {
2744             PartialEq::eq(&x, &y)
2745         }
2746 
2747         let other = other.into_par_iter();
2748         self.len() == other.len() && self.zip(other).all(eq)
2749     }
2750 
2751     /// Determines if the elements of this `ParallelIterator`
2752     /// are unequal to those of another
ne<I>(self, other: I) -> bool where I: IntoParallelIterator, I::Iter: IndexedParallelIterator, Self::Item: PartialEq<I::Item>,2753     fn ne<I>(self, other: I) -> bool
2754     where
2755         I: IntoParallelIterator,
2756         I::Iter: IndexedParallelIterator,
2757         Self::Item: PartialEq<I::Item>,
2758     {
2759         !self.eq(other)
2760     }
2761 
2762     /// Determines if the elements of this `ParallelIterator`
2763     /// are lexicographically less than those of another.
lt<I>(self, other: I) -> bool where I: IntoParallelIterator, I::Iter: IndexedParallelIterator, Self::Item: PartialOrd<I::Item>,2764     fn lt<I>(self, other: I) -> bool
2765     where
2766         I: IntoParallelIterator,
2767         I::Iter: IndexedParallelIterator,
2768         Self::Item: PartialOrd<I::Item>,
2769     {
2770         self.partial_cmp(other) == Some(Ordering::Less)
2771     }
2772 
2773     /// Determines if the elements of this `ParallelIterator`
2774     /// are less or equal to those of another.
le<I>(self, other: I) -> bool where I: IntoParallelIterator, I::Iter: IndexedParallelIterator, Self::Item: PartialOrd<I::Item>,2775     fn le<I>(self, other: I) -> bool
2776     where
2777         I: IntoParallelIterator,
2778         I::Iter: IndexedParallelIterator,
2779         Self::Item: PartialOrd<I::Item>,
2780     {
2781         let ord = self.partial_cmp(other);
2782         ord == Some(Ordering::Equal) || ord == Some(Ordering::Less)
2783     }
2784 
2785     /// Determines if the elements of this `ParallelIterator`
2786     /// are lexicographically greater than those of another.
gt<I>(self, other: I) -> bool where I: IntoParallelIterator, I::Iter: IndexedParallelIterator, Self::Item: PartialOrd<I::Item>,2787     fn gt<I>(self, other: I) -> bool
2788     where
2789         I: IntoParallelIterator,
2790         I::Iter: IndexedParallelIterator,
2791         Self::Item: PartialOrd<I::Item>,
2792     {
2793         self.partial_cmp(other) == Some(Ordering::Greater)
2794     }
2795 
2796     /// Determines if the elements of this `ParallelIterator`
2797     /// are less or equal to those of another.
ge<I>(self, other: I) -> bool where I: IntoParallelIterator, I::Iter: IndexedParallelIterator, Self::Item: PartialOrd<I::Item>,2798     fn ge<I>(self, other: I) -> bool
2799     where
2800         I: IntoParallelIterator,
2801         I::Iter: IndexedParallelIterator,
2802         Self::Item: PartialOrd<I::Item>,
2803     {
2804         let ord = self.partial_cmp(other);
2805         ord == Some(Ordering::Equal) || ord == Some(Ordering::Greater)
2806     }
2807 
2808     /// Yields an index along with each item.
2809     ///
2810     /// # Examples
2811     ///
2812     /// ```
2813     /// use rayon::prelude::*;
2814     ///
2815     /// let chars = vec!['a', 'b', 'c'];
2816     /// let result: Vec<_> = chars
2817     ///     .into_par_iter()
2818     ///     .enumerate()
2819     ///     .collect();
2820     ///
2821     /// assert_eq!(result, [(0, 'a'), (1, 'b'), (2, 'c')]);
2822     /// ```
enumerate(self) -> Enumerate<Self>2823     fn enumerate(self) -> Enumerate<Self> {
2824         Enumerate::new(self)
2825     }
2826 
2827     /// Creates an iterator that steps by the given amount
2828     ///
2829     /// # Examples
2830     ///
2831     /// ```
2832     ///use rayon::prelude::*;
2833     ///
2834     /// let range = (3..10);
2835     /// let result: Vec<i32> = range
2836     ///    .into_par_iter()
2837     ///    .step_by(3)
2838     ///    .collect();
2839     ///
2840     /// assert_eq!(result, [3, 6, 9])
2841     /// ```
step_by(self, step: usize) -> StepBy<Self>2842     fn step_by(self, step: usize) -> StepBy<Self> {
2843         StepBy::new(self, step)
2844     }
2845 
2846     /// Creates an iterator that skips the first `n` elements.
2847     ///
2848     /// # Examples
2849     ///
2850     /// ```
2851     /// use rayon::prelude::*;
2852     ///
2853     /// let result: Vec<_> = (0..100)
2854     ///     .into_par_iter()
2855     ///     .skip(95)
2856     ///     .collect();
2857     ///
2858     /// assert_eq!(result, [95, 96, 97, 98, 99]);
2859     /// ```
skip(self, n: usize) -> Skip<Self>2860     fn skip(self, n: usize) -> Skip<Self> {
2861         Skip::new(self, n)
2862     }
2863 
2864     /// Creates an iterator that yields the first `n` elements.
2865     ///
2866     /// # Examples
2867     ///
2868     /// ```
2869     /// use rayon::prelude::*;
2870     ///
2871     /// let result: Vec<_> = (0..100)
2872     ///     .into_par_iter()
2873     ///     .take(5)
2874     ///     .collect();
2875     ///
2876     /// assert_eq!(result, [0, 1, 2, 3, 4]);
2877     /// ```
take(self, n: usize) -> Take<Self>2878     fn take(self, n: usize) -> Take<Self> {
2879         Take::new(self, n)
2880     }
2881 
2882     /// Searches for **some** item in the parallel iterator that
2883     /// matches the given predicate, and returns its index.  Like
2884     /// `ParallelIterator::find_any`, the parallel search will not
2885     /// necessarily find the **first** match, and once a match is
2886     /// found we'll attempt to stop processing any more.
2887     ///
2888     /// # Examples
2889     ///
2890     /// ```
2891     /// use rayon::prelude::*;
2892     ///
2893     /// let a = [1, 2, 3, 3];
2894     ///
2895     /// let i = a.par_iter().position_any(|&x| x == 3).expect("found");
2896     /// assert!(i == 2 || i == 3);
2897     ///
2898     /// assert_eq!(a.par_iter().position_any(|&x| x == 100), None);
2899     /// ```
position_any<P>(self, predicate: P) -> Option<usize> where P: Fn(Self::Item) -> bool + Sync + Send,2900     fn position_any<P>(self, predicate: P) -> Option<usize>
2901     where
2902         P: Fn(Self::Item) -> bool + Sync + Send,
2903     {
2904         #[inline]
2905         fn check(&(_, p): &(usize, bool)) -> bool {
2906             p
2907         }
2908 
2909         let (i, _) = self.map(predicate).enumerate().find_any(check)?;
2910         Some(i)
2911     }
2912 
2913     /// Searches for the sequentially **first** item in the parallel iterator
2914     /// that matches the given predicate, and returns its index.
2915     ///
2916     /// Like `ParallelIterator::find_first`, once a match is found,
2917     /// all attempts to the right of the match will be stopped, while
2918     /// attempts to the left must continue in case an earlier match
2919     /// is found.
2920     ///
2921     /// Note that not all parallel iterators have a useful order, much like
2922     /// sequential `HashMap` iteration, so "first" may be nebulous.  If you
2923     /// just want the first match that discovered anywhere in the iterator,
2924     /// `position_any` is a better choice.
2925     ///
2926     /// # Examples
2927     ///
2928     /// ```
2929     /// use rayon::prelude::*;
2930     ///
2931     /// let a = [1, 2, 3, 3];
2932     ///
2933     /// assert_eq!(a.par_iter().position_first(|&x| x == 3), Some(2));
2934     ///
2935     /// assert_eq!(a.par_iter().position_first(|&x| x == 100), None);
2936     /// ```
position_first<P>(self, predicate: P) -> Option<usize> where P: Fn(Self::Item) -> bool + Sync + Send,2937     fn position_first<P>(self, predicate: P) -> Option<usize>
2938     where
2939         P: Fn(Self::Item) -> bool + Sync + Send,
2940     {
2941         #[inline]
2942         fn check(&(_, p): &(usize, bool)) -> bool {
2943             p
2944         }
2945 
2946         let (i, _) = self.map(predicate).enumerate().find_first(check)?;
2947         Some(i)
2948     }
2949 
2950     /// Searches for the sequentially **last** item in the parallel iterator
2951     /// that matches the given predicate, and returns its index.
2952     ///
2953     /// Like `ParallelIterator::find_last`, once a match is found,
2954     /// all attempts to the left of the match will be stopped, while
2955     /// attempts to the right must continue in case a later match
2956     /// is found.
2957     ///
2958     /// Note that not all parallel iterators have a useful order, much like
2959     /// sequential `HashMap` iteration, so "last" may be nebulous.  When the
2960     /// order doesn't actually matter to you, `position_any` is a better
2961     /// choice.
2962     ///
2963     /// # Examples
2964     ///
2965     /// ```
2966     /// use rayon::prelude::*;
2967     ///
2968     /// let a = [1, 2, 3, 3];
2969     ///
2970     /// assert_eq!(a.par_iter().position_last(|&x| x == 3), Some(3));
2971     ///
2972     /// assert_eq!(a.par_iter().position_last(|&x| x == 100), None);
2973     /// ```
position_last<P>(self, predicate: P) -> Option<usize> where P: Fn(Self::Item) -> bool + Sync + Send,2974     fn position_last<P>(self, predicate: P) -> Option<usize>
2975     where
2976         P: Fn(Self::Item) -> bool + Sync + Send,
2977     {
2978         #[inline]
2979         fn check(&(_, p): &(usize, bool)) -> bool {
2980             p
2981         }
2982 
2983         let (i, _) = self.map(predicate).enumerate().find_last(check)?;
2984         Some(i)
2985     }
2986 
2987     #[doc(hidden)]
2988     #[deprecated(
2989         note = "parallel `position` does not search in order -- use `position_any`, \\
2990                 `position_first`, or `position_last`"
2991     )]
position<P>(self, predicate: P) -> Option<usize> where P: Fn(Self::Item) -> bool + Sync + Send,2992     fn position<P>(self, predicate: P) -> Option<usize>
2993     where
2994         P: Fn(Self::Item) -> bool + Sync + Send,
2995     {
2996         self.position_any(predicate)
2997     }
2998 
2999     /// Searches for items in the parallel iterator that match the given
3000     /// predicate, and returns their indices.
3001     ///
3002     /// # Examples
3003     ///
3004     /// ```
3005     /// use rayon::prelude::*;
3006     ///
3007     /// let primes = vec![2, 3, 5, 7, 11, 13, 17, 19, 23, 29];
3008     ///
3009     /// // Find the positions of primes congruent to 1 modulo 6
3010     /// let p1mod6: Vec<_> = primes.par_iter().positions(|&p| p % 6 == 1).collect();
3011     /// assert_eq!(p1mod6, [3, 5, 7]); // primes 7, 13, and 19
3012     ///
3013     /// // Find the positions of primes congruent to 5 modulo 6
3014     /// let p5mod6: Vec<_> = primes.par_iter().positions(|&p| p % 6 == 5).collect();
3015     /// assert_eq!(p5mod6, [2, 4, 6, 8, 9]); // primes 5, 11, 17, 23, and 29
3016     /// ```
positions<P>(self, predicate: P) -> Positions<Self, P> where P: Fn(Self::Item) -> bool + Sync + Send,3017     fn positions<P>(self, predicate: P) -> Positions<Self, P>
3018     where
3019         P: Fn(Self::Item) -> bool + Sync + Send,
3020     {
3021         Positions::new(self, predicate)
3022     }
3023 
3024     /// Produces a new iterator with the elements of this iterator in
3025     /// reverse order.
3026     ///
3027     /// # Examples
3028     ///
3029     /// ```
3030     /// use rayon::prelude::*;
3031     ///
3032     /// let result: Vec<_> = (0..5)
3033     ///     .into_par_iter()
3034     ///     .rev()
3035     ///     .collect();
3036     ///
3037     /// assert_eq!(result, [4, 3, 2, 1, 0]);
3038     /// ```
rev(self) -> Rev<Self>3039     fn rev(self) -> Rev<Self> {
3040         Rev::new(self)
3041     }
3042 
3043     /// Sets the minimum length of iterators desired to process in each
3044     /// rayon job.  Rayon will not split any smaller than this length, but
3045     /// of course an iterator could already be smaller to begin with.
3046     ///
3047     /// Producers like `zip` and `interleave` will use greater of the two
3048     /// minimums.
3049     /// Chained iterators and iterators inside `flat_map` may each use
3050     /// their own minimum length.
3051     ///
3052     /// # Examples
3053     ///
3054     /// ```
3055     /// use rayon::prelude::*;
3056     ///
3057     /// let min = (0..1_000_000)
3058     ///     .into_par_iter()
3059     ///     .with_min_len(1234)
3060     ///     .fold(|| 0, |acc, _| acc + 1) // count how many are in this segment
3061     ///     .min().unwrap();
3062     ///
3063     /// assert!(min >= 1234);
3064     /// ```
with_min_len(self, min: usize) -> MinLen<Self>3065     fn with_min_len(self, min: usize) -> MinLen<Self> {
3066         MinLen::new(self, min)
3067     }
3068 
3069     /// Sets the maximum length of iterators desired to process in each
3070     /// rayon job.  Rayon will try to split at least below this length,
3071     /// unless that would put it below the length from `with_min_len()`.
3072     /// For example, given min=10 and max=15, a length of 16 will not be
3073     /// split any further.
3074     ///
3075     /// Producers like `zip` and `interleave` will use lesser of the two
3076     /// maximums.
3077     /// Chained iterators and iterators inside `flat_map` may each use
3078     /// their own maximum length.
3079     ///
3080     /// # Examples
3081     ///
3082     /// ```
3083     /// use rayon::prelude::*;
3084     ///
3085     /// let max = (0..1_000_000)
3086     ///     .into_par_iter()
3087     ///     .with_max_len(1234)
3088     ///     .fold(|| 0, |acc, _| acc + 1) // count how many are in this segment
3089     ///     .max().unwrap();
3090     ///
3091     /// assert!(max <= 1234);
3092     /// ```
with_max_len(self, max: usize) -> MaxLen<Self>3093     fn with_max_len(self, max: usize) -> MaxLen<Self> {
3094         MaxLen::new(self, max)
3095     }
3096 
3097     /// Produces an exact count of how many items this iterator will
3098     /// produce, presuming no panic occurs.
3099     ///
3100     /// # Examples
3101     ///
3102     /// ```
3103     /// use rayon::prelude::*;
3104     ///
3105     /// let par_iter = (0..100).into_par_iter().zip(vec![0; 10]);
3106     /// assert_eq!(par_iter.len(), 10);
3107     ///
3108     /// let vec: Vec<_> = par_iter.collect();
3109     /// assert_eq!(vec.len(), 10);
3110     /// ```
len(&self) -> usize3111     fn len(&self) -> usize;
3112 
3113     /// Internal method used to define the behavior of this parallel
3114     /// iterator. You should not need to call this directly.
3115     ///
3116     /// This method causes the iterator `self` to start producing
3117     /// items and to feed them to the consumer `consumer` one by one.
3118     /// It may split the consumer before doing so to create the
3119     /// opportunity to produce in parallel. If a split does happen, it
3120     /// will inform the consumer of the index where the split should
3121     /// occur (unlike `ParallelIterator::drive_unindexed()`).
3122     ///
3123     /// See the [README] for more details on the internals of parallel
3124     /// iterators.
3125     ///
3126     /// [README]: https://github.com/rayon-rs/rayon/blob/master/src/iter/plumbing/README.md
drive<C: Consumer<Self::Item>>(self, consumer: C) -> C::Result3127     fn drive<C: Consumer<Self::Item>>(self, consumer: C) -> C::Result;
3128 
3129     /// Internal method used to define the behavior of this parallel
3130     /// iterator. You should not need to call this directly.
3131     ///
3132     /// This method converts the iterator into a producer P and then
3133     /// invokes `callback.callback()` with P. Note that the type of
3134     /// this producer is not defined as part of the API, since
3135     /// `callback` must be defined generically for all producers. This
3136     /// allows the producer type to contain references; it also means
3137     /// that parallel iterators can adjust that type without causing a
3138     /// breaking change.
3139     ///
3140     /// See the [README] for more details on the internals of parallel
3141     /// iterators.
3142     ///
3143     /// [README]: https://github.com/rayon-rs/rayon/blob/master/src/iter/plumbing/README.md
with_producer<CB: ProducerCallback<Self::Item>>(self, callback: CB) -> CB::Output3144     fn with_producer<CB: ProducerCallback<Self::Item>>(self, callback: CB) -> CB::Output;
3145 }
3146 
3147 /// `FromParallelIterator` implements the creation of a collection
3148 /// from a [`ParallelIterator`]. By implementing
3149 /// `FromParallelIterator` for a given type, you define how it will be
3150 /// created from an iterator.
3151 ///
3152 /// `FromParallelIterator` is used through [`ParallelIterator`]'s [`collect()`] method.
3153 ///
3154 /// [`ParallelIterator`]: trait.ParallelIterator.html
3155 /// [`collect()`]: trait.ParallelIterator.html#method.collect
3156 ///
3157 /// # Examples
3158 ///
3159 /// Implementing `FromParallelIterator` for your type:
3160 ///
3161 /// ```
3162 /// use rayon::prelude::*;
3163 /// use std::mem;
3164 ///
3165 /// struct BlackHole {
3166 ///     mass: usize,
3167 /// }
3168 ///
3169 /// impl<T: Send> FromParallelIterator<T> for BlackHole {
3170 ///     fn from_par_iter<I>(par_iter: I) -> Self
3171 ///         where I: IntoParallelIterator<Item = T>
3172 ///     {
3173 ///         let par_iter = par_iter.into_par_iter();
3174 ///         BlackHole {
3175 ///             mass: par_iter.count() * mem::size_of::<T>(),
3176 ///         }
3177 ///     }
3178 /// }
3179 ///
3180 /// let bh: BlackHole = (0i32..1000).into_par_iter().collect();
3181 /// assert_eq!(bh.mass, 4000);
3182 /// ```
3183 pub trait FromParallelIterator<T>
3184 where
3185     T: Send,
3186 {
3187     /// Creates an instance of the collection from the parallel iterator `par_iter`.
3188     ///
3189     /// If your collection is not naturally parallel, the easiest (and
3190     /// fastest) way to do this is often to collect `par_iter` into a
3191     /// [`LinkedList`] or other intermediate data structure and then
3192     /// sequentially extend your collection. However, a more 'native'
3193     /// technique is to use the [`par_iter.fold`] or
3194     /// [`par_iter.fold_with`] methods to create the collection.
3195     /// Alternatively, if your collection is 'natively' parallel, you
3196     /// can use `par_iter.for_each` to process each element in turn.
3197     ///
3198     /// [`LinkedList`]: https://doc.rust-lang.org/std/collections/struct.LinkedList.html
3199     /// [`par_iter.fold`]: trait.ParallelIterator.html#method.fold
3200     /// [`par_iter.fold_with`]: trait.ParallelIterator.html#method.fold_with
3201     /// [`par_iter.for_each`]: trait.ParallelIterator.html#method.for_each
from_par_iter<I>(par_iter: I) -> Self where I: IntoParallelIterator<Item = T>3202     fn from_par_iter<I>(par_iter: I) -> Self
3203     where
3204         I: IntoParallelIterator<Item = T>;
3205 }
3206 
3207 /// `ParallelExtend` extends an existing collection with items from a [`ParallelIterator`].
3208 ///
3209 /// [`ParallelIterator`]: trait.ParallelIterator.html
3210 ///
3211 /// # Examples
3212 ///
3213 /// Implementing `ParallelExtend` for your type:
3214 ///
3215 /// ```
3216 /// use rayon::prelude::*;
3217 /// use std::mem;
3218 ///
3219 /// struct BlackHole {
3220 ///     mass: usize,
3221 /// }
3222 ///
3223 /// impl<T: Send> ParallelExtend<T> for BlackHole {
3224 ///     fn par_extend<I>(&mut self, par_iter: I)
3225 ///         where I: IntoParallelIterator<Item = T>
3226 ///     {
3227 ///         let par_iter = par_iter.into_par_iter();
3228 ///         self.mass += par_iter.count() * mem::size_of::<T>();
3229 ///     }
3230 /// }
3231 ///
3232 /// let mut bh = BlackHole { mass: 0 };
3233 /// bh.par_extend(0i32..1000);
3234 /// assert_eq!(bh.mass, 4000);
3235 /// bh.par_extend(0i64..10);
3236 /// assert_eq!(bh.mass, 4080);
3237 /// ```
3238 pub trait ParallelExtend<T>
3239 where
3240     T: Send,
3241 {
3242     /// Extends an instance of the collection with the elements drawn
3243     /// from the parallel iterator `par_iter`.
3244     ///
3245     /// # Examples
3246     ///
3247     /// ```
3248     /// use rayon::prelude::*;
3249     ///
3250     /// let mut vec = vec![];
3251     /// vec.par_extend(0..5);
3252     /// vec.par_extend((0..5).into_par_iter().map(|i| i * i));
3253     /// assert_eq!(vec, [0, 1, 2, 3, 4, 0, 1, 4, 9, 16]);
3254     /// ```
par_extend<I>(&mut self, par_iter: I) where I: IntoParallelIterator<Item = T>3255     fn par_extend<I>(&mut self, par_iter: I)
3256     where
3257         I: IntoParallelIterator<Item = T>;
3258 }
3259 
3260 /// `ParallelDrainFull` creates a parallel iterator that moves all items
3261 /// from a collection while retaining the original capacity.
3262 ///
3263 /// Types which are indexable typically implement [`ParallelDrainRange`]
3264 /// instead, where you can drain fully with `par_drain(..)`.
3265 ///
3266 /// [`ParallelDrainRange`]: trait.ParallelDrainRange.html
3267 pub trait ParallelDrainFull {
3268     /// The draining parallel iterator type that will be created.
3269     type Iter: ParallelIterator<Item = Self::Item>;
3270 
3271     /// The type of item that the parallel iterator will produce.
3272     /// This is usually the same as `IntoParallelIterator::Item`.
3273     type Item: Send;
3274 
3275     /// Returns a draining parallel iterator over an entire collection.
3276     ///
3277     /// When the iterator is dropped, all items are removed, even if the
3278     /// iterator was not fully consumed. If the iterator is leaked, for example
3279     /// using `std::mem::forget`, it is unspecified how many items are removed.
3280     ///
3281     /// # Examples
3282     ///
3283     /// ```
3284     /// use rayon::prelude::*;
3285     /// use std::collections::{BinaryHeap, HashSet};
3286     ///
3287     /// let squares: HashSet<i32> = (0..10).map(|x| x * x).collect();
3288     ///
3289     /// let mut heap: BinaryHeap<_> = squares.iter().copied().collect();
3290     /// assert_eq!(
3291     ///     // heaps are drained in arbitrary order
3292     ///     heap.par_drain()
3293     ///         .inspect(|x| assert!(squares.contains(x)))
3294     ///         .count(),
3295     ///     squares.len(),
3296     /// );
3297     /// assert!(heap.is_empty());
3298     /// assert!(heap.capacity() >= squares.len());
3299     /// ```
par_drain(self) -> Self::Iter3300     fn par_drain(self) -> Self::Iter;
3301 }
3302 
3303 /// `ParallelDrainRange` creates a parallel iterator that moves a range of items
3304 /// from a collection while retaining the original capacity.
3305 ///
3306 /// Types which are not indexable may implement [`ParallelDrainFull`] instead.
3307 ///
3308 /// [`ParallelDrainFull`]: trait.ParallelDrainFull.html
3309 pub trait ParallelDrainRange<Idx = usize> {
3310     /// The draining parallel iterator type that will be created.
3311     type Iter: ParallelIterator<Item = Self::Item>;
3312 
3313     /// The type of item that the parallel iterator will produce.
3314     /// This is usually the same as `IntoParallelIterator::Item`.
3315     type Item: Send;
3316 
3317     /// Returns a draining parallel iterator over a range of the collection.
3318     ///
3319     /// When the iterator is dropped, all items in the range are removed, even
3320     /// if the iterator was not fully consumed. If the iterator is leaked, for
3321     /// example using `std::mem::forget`, it is unspecified how many items are
3322     /// removed.
3323     ///
3324     /// # Examples
3325     ///
3326     /// ```
3327     /// use rayon::prelude::*;
3328     ///
3329     /// let squares: Vec<i32> = (0..10).map(|x| x * x).collect();
3330     ///
3331     /// println!("RangeFull");
3332     /// let mut vec = squares.clone();
3333     /// assert!(vec.par_drain(..)
3334     ///            .eq(squares.par_iter().copied()));
3335     /// assert!(vec.is_empty());
3336     /// assert!(vec.capacity() >= squares.len());
3337     ///
3338     /// println!("RangeFrom");
3339     /// let mut vec = squares.clone();
3340     /// assert!(vec.par_drain(5..)
3341     ///            .eq(squares[5..].par_iter().copied()));
3342     /// assert_eq!(&vec[..], &squares[..5]);
3343     /// assert!(vec.capacity() >= squares.len());
3344     ///
3345     /// println!("RangeTo");
3346     /// let mut vec = squares.clone();
3347     /// assert!(vec.par_drain(..5)
3348     ///            .eq(squares[..5].par_iter().copied()));
3349     /// assert_eq!(&vec[..], &squares[5..]);
3350     /// assert!(vec.capacity() >= squares.len());
3351     ///
3352     /// println!("RangeToInclusive");
3353     /// let mut vec = squares.clone();
3354     /// assert!(vec.par_drain(..=5)
3355     ///            .eq(squares[..=5].par_iter().copied()));
3356     /// assert_eq!(&vec[..], &squares[6..]);
3357     /// assert!(vec.capacity() >= squares.len());
3358     ///
3359     /// println!("Range");
3360     /// let mut vec = squares.clone();
3361     /// assert!(vec.par_drain(3..7)
3362     ///            .eq(squares[3..7].par_iter().copied()));
3363     /// assert_eq!(&vec[..3], &squares[..3]);
3364     /// assert_eq!(&vec[3..], &squares[7..]);
3365     /// assert!(vec.capacity() >= squares.len());
3366     ///
3367     /// println!("RangeInclusive");
3368     /// let mut vec = squares.clone();
3369     /// assert!(vec.par_drain(3..=7)
3370     ///            .eq(squares[3..=7].par_iter().copied()));
3371     /// assert_eq!(&vec[..3], &squares[..3]);
3372     /// assert_eq!(&vec[3..], &squares[8..]);
3373     /// assert!(vec.capacity() >= squares.len());
3374     /// ```
par_drain<R: RangeBounds<Idx>>(self, range: R) -> Self::Iter3375     fn par_drain<R: RangeBounds<Idx>>(self, range: R) -> Self::Iter;
3376 }
3377 
3378 /// We hide the `Try` trait in a private module, as it's only meant to be a
3379 /// stable clone of the standard library's `Try` trait, as yet unstable.
3380 mod private {
3381     use std::convert::Infallible;
3382     use std::ops::ControlFlow::{self, Break, Continue};
3383     use std::task::Poll;
3384 
3385     /// Clone of `std::ops::Try`.
3386     ///
3387     /// Implementing this trait is not permitted outside of `rayon`.
3388     pub trait Try {
3389         private_decl! {}
3390 
3391         type Output;
3392         type Residual;
3393 
from_output(output: Self::Output) -> Self3394         fn from_output(output: Self::Output) -> Self;
3395 
from_residual(residual: Self::Residual) -> Self3396         fn from_residual(residual: Self::Residual) -> Self;
3397 
branch(self) -> ControlFlow<Self::Residual, Self::Output>3398         fn branch(self) -> ControlFlow<Self::Residual, Self::Output>;
3399     }
3400 
3401     impl<B, C> Try for ControlFlow<B, C> {
3402         private_impl! {}
3403 
3404         type Output = C;
3405         type Residual = ControlFlow<B, Infallible>;
3406 
from_output(output: Self::Output) -> Self3407         fn from_output(output: Self::Output) -> Self {
3408             Continue(output)
3409         }
3410 
from_residual(residual: Self::Residual) -> Self3411         fn from_residual(residual: Self::Residual) -> Self {
3412             match residual {
3413                 Break(b) => Break(b),
3414                 Continue(_) => unreachable!(),
3415             }
3416         }
3417 
branch(self) -> ControlFlow<Self::Residual, Self::Output>3418         fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
3419             match self {
3420                 Continue(c) => Continue(c),
3421                 Break(b) => Break(Break(b)),
3422             }
3423         }
3424     }
3425 
3426     impl<T> Try for Option<T> {
3427         private_impl! {}
3428 
3429         type Output = T;
3430         type Residual = Option<Infallible>;
3431 
from_output(output: Self::Output) -> Self3432         fn from_output(output: Self::Output) -> Self {
3433             Some(output)
3434         }
3435 
from_residual(residual: Self::Residual) -> Self3436         fn from_residual(residual: Self::Residual) -> Self {
3437             match residual {
3438                 None => None,
3439                 Some(_) => unreachable!(),
3440             }
3441         }
3442 
branch(self) -> ControlFlow<Self::Residual, Self::Output>3443         fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
3444             match self {
3445                 Some(c) => Continue(c),
3446                 None => Break(None),
3447             }
3448         }
3449     }
3450 
3451     impl<T, E> Try for Result<T, E> {
3452         private_impl! {}
3453 
3454         type Output = T;
3455         type Residual = Result<Infallible, E>;
3456 
from_output(output: Self::Output) -> Self3457         fn from_output(output: Self::Output) -> Self {
3458             Ok(output)
3459         }
3460 
from_residual(residual: Self::Residual) -> Self3461         fn from_residual(residual: Self::Residual) -> Self {
3462             match residual {
3463                 Err(e) => Err(e),
3464                 Ok(_) => unreachable!(),
3465             }
3466         }
3467 
branch(self) -> ControlFlow<Self::Residual, Self::Output>3468         fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
3469             match self {
3470                 Ok(c) => Continue(c),
3471                 Err(e) => Break(Err(e)),
3472             }
3473         }
3474     }
3475 
3476     impl<T, E> Try for Poll<Result<T, E>> {
3477         private_impl! {}
3478 
3479         type Output = Poll<T>;
3480         type Residual = Result<Infallible, E>;
3481 
from_output(output: Self::Output) -> Self3482         fn from_output(output: Self::Output) -> Self {
3483             output.map(Ok)
3484         }
3485 
from_residual(residual: Self::Residual) -> Self3486         fn from_residual(residual: Self::Residual) -> Self {
3487             match residual {
3488                 Err(e) => Poll::Ready(Err(e)),
3489                 Ok(_) => unreachable!(),
3490             }
3491         }
3492 
branch(self) -> ControlFlow<Self::Residual, Self::Output>3493         fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
3494             match self {
3495                 Poll::Pending => Continue(Poll::Pending),
3496                 Poll::Ready(Ok(c)) => Continue(Poll::Ready(c)),
3497                 Poll::Ready(Err(e)) => Break(Err(e)),
3498             }
3499         }
3500     }
3501 
3502     impl<T, E> Try for Poll<Option<Result<T, E>>> {
3503         private_impl! {}
3504 
3505         type Output = Poll<Option<T>>;
3506         type Residual = Result<Infallible, E>;
3507 
from_output(output: Self::Output) -> Self3508         fn from_output(output: Self::Output) -> Self {
3509             match output {
3510                 Poll::Ready(o) => Poll::Ready(o.map(Ok)),
3511                 Poll::Pending => Poll::Pending,
3512             }
3513         }
3514 
from_residual(residual: Self::Residual) -> Self3515         fn from_residual(residual: Self::Residual) -> Self {
3516             match residual {
3517                 Err(e) => Poll::Ready(Some(Err(e))),
3518                 Ok(_) => unreachable!(),
3519             }
3520         }
3521 
branch(self) -> ControlFlow<Self::Residual, Self::Output>3522         fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
3523             match self {
3524                 Poll::Pending => Continue(Poll::Pending),
3525                 Poll::Ready(None) => Continue(Poll::Ready(None)),
3526                 Poll::Ready(Some(Ok(c))) => Continue(Poll::Ready(Some(c))),
3527                 Poll::Ready(Some(Err(e))) => Break(Err(e)),
3528             }
3529         }
3530     }
3531 }
3532