use crate::iter::plumbing::*; use crate::iter::*; /// Creates a parallel iterator that produces an element exactly once. /// /// This admits no parallelism on its own, but it could be chained to existing /// parallel iterators to extend their contents, or otherwise used for any code /// that deals with generic parallel iterators. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// use rayon::iter::once; /// /// let pi = (0..1234).into_par_iter() /// .chain(once(-1)) /// .chain(1234..10_000); /// /// assert_eq!(pi.clone().count(), 10_001); /// assert_eq!(pi.clone().filter(|&x| x < 0).count(), 1); /// assert_eq!(pi.position_any(|x| x < 0), Some(1234)); /// ``` pub fn once(item: T) -> Once { Once { item } } /// Iterator adaptor for [the `once()` function](fn.once.html). #[derive(Clone, Debug)] pub struct Once { item: T, } impl ParallelIterator for Once { type Item = T; fn drive_unindexed(self, consumer: C) -> C::Result where C: UnindexedConsumer, { self.drive(consumer) } fn opt_len(&self) -> Option { Some(1) } } impl IndexedParallelIterator for Once { fn drive(self, consumer: C) -> C::Result where C: Consumer, { consumer.into_folder().consume(self.item).complete() } fn len(&self) -> usize { 1 } fn with_producer(self, callback: CB) -> CB::Output where CB: ProducerCallback, { // Let `OptionProducer` handle it. Some(self.item).into_par_iter().with_producer(callback) } }