1 //! Licensed under the Apache License, Version 2.0
2 //! <https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 //! <https://opensource.org/licenses/MIT>, at your
4 //! option. This file may not be copied, modified, or distributed
5 //! except according to those terms.
6 
7 mod coalesce;
8 pub(crate) mod map;
9 mod multi_product;
10 pub use self::coalesce::*;
11 pub use self::map::{map_into, map_ok, MapInto, MapOk};
12 #[cfg(feature = "use_alloc")]
13 pub use self::multi_product::*;
14 
15 use crate::size_hint::{self, SizeHint};
16 use std::fmt;
17 use std::iter::{Enumerate, FromIterator, Fuse, FusedIterator};
18 use std::marker::PhantomData;
19 
20 /// An iterator adaptor that alternates elements from two iterators until both
21 /// run out.
22 ///
23 /// This iterator is *fused*.
24 ///
25 /// See [`.interleave()`](crate::Itertools::interleave) for more information.
26 #[derive(Clone, Debug)]
27 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
28 pub struct Interleave<I, J> {
29     i: Fuse<I>,
30     j: Fuse<J>,
31     next_coming_from_j: bool,
32 }
33 
34 /// Create an iterator that interleaves elements in `i` and `j`.
35 ///
36 /// [`IntoIterator`] enabled version of [`Itertools::interleave`](crate::Itertools::interleave).
interleave<I, J>( i: I, j: J, ) -> Interleave<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter> where I: IntoIterator, J: IntoIterator<Item = I::Item>,37 pub fn interleave<I, J>(
38     i: I,
39     j: J,
40 ) -> Interleave<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter>
41 where
42     I: IntoIterator,
43     J: IntoIterator<Item = I::Item>,
44 {
45     Interleave {
46         i: i.into_iter().fuse(),
47         j: j.into_iter().fuse(),
48         next_coming_from_j: false,
49     }
50 }
51 
52 impl<I, J> Iterator for Interleave<I, J>
53 where
54     I: Iterator,
55     J: Iterator<Item = I::Item>,
56 {
57     type Item = I::Item;
58     #[inline]
next(&mut self) -> Option<Self::Item>59     fn next(&mut self) -> Option<Self::Item> {
60         self.next_coming_from_j = !self.next_coming_from_j;
61         if self.next_coming_from_j {
62             match self.i.next() {
63                 None => self.j.next(),
64                 r => r,
65             }
66         } else {
67             match self.j.next() {
68                 None => self.i.next(),
69                 r => r,
70             }
71         }
72     }
73 
size_hint(&self) -> (usize, Option<usize>)74     fn size_hint(&self) -> (usize, Option<usize>) {
75         size_hint::add(self.i.size_hint(), self.j.size_hint())
76     }
77 
fold<B, F>(self, mut init: B, mut f: F) -> B where F: FnMut(B, Self::Item) -> B,78     fn fold<B, F>(self, mut init: B, mut f: F) -> B
79     where
80         F: FnMut(B, Self::Item) -> B,
81     {
82         let Self {
83             mut i,
84             mut j,
85             next_coming_from_j,
86         } = self;
87         if next_coming_from_j {
88             match j.next() {
89                 Some(y) => init = f(init, y),
90                 None => return i.fold(init, f),
91             }
92         }
93         let res = i.try_fold(init, |mut acc, x| {
94             acc = f(acc, x);
95             match j.next() {
96                 Some(y) => Ok(f(acc, y)),
97                 None => Err(acc),
98             }
99         });
100         match res {
101             Ok(acc) => j.fold(acc, f),
102             Err(acc) => i.fold(acc, f),
103         }
104     }
105 }
106 
107 impl<I, J> FusedIterator for Interleave<I, J>
108 where
109     I: Iterator,
110     J: Iterator<Item = I::Item>,
111 {
112 }
113 
114 /// An iterator adaptor that alternates elements from the two iterators until
115 /// one of them runs out.
116 ///
117 /// This iterator is *fused*.
118 ///
119 /// See [`.interleave_shortest()`](crate::Itertools::interleave_shortest)
120 /// for more information.
121 #[derive(Clone, Debug)]
122 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
123 pub struct InterleaveShortest<I, J>
124 where
125     I: Iterator,
126     J: Iterator<Item = I::Item>,
127 {
128     i: I,
129     j: J,
130     next_coming_from_j: bool,
131 }
132 
133 /// Create a new `InterleaveShortest` iterator.
interleave_shortest<I, J>(i: I, j: J) -> InterleaveShortest<I, J> where I: Iterator, J: Iterator<Item = I::Item>,134 pub fn interleave_shortest<I, J>(i: I, j: J) -> InterleaveShortest<I, J>
135 where
136     I: Iterator,
137     J: Iterator<Item = I::Item>,
138 {
139     InterleaveShortest {
140         i,
141         j,
142         next_coming_from_j: false,
143     }
144 }
145 
146 impl<I, J> Iterator for InterleaveShortest<I, J>
147 where
148     I: Iterator,
149     J: Iterator<Item = I::Item>,
150 {
151     type Item = I::Item;
152 
153     #[inline]
next(&mut self) -> Option<Self::Item>154     fn next(&mut self) -> Option<Self::Item> {
155         let e = if self.next_coming_from_j {
156             self.j.next()
157         } else {
158             self.i.next()
159         };
160         if e.is_some() {
161             self.next_coming_from_j = !self.next_coming_from_j;
162         }
163         e
164     }
165 
166     #[inline]
size_hint(&self) -> (usize, Option<usize>)167     fn size_hint(&self) -> (usize, Option<usize>) {
168         let (curr_hint, next_hint) = {
169             let i_hint = self.i.size_hint();
170             let j_hint = self.j.size_hint();
171             if self.next_coming_from_j {
172                 (j_hint, i_hint)
173             } else {
174                 (i_hint, j_hint)
175             }
176         };
177         let (curr_lower, curr_upper) = curr_hint;
178         let (next_lower, next_upper) = next_hint;
179         let (combined_lower, combined_upper) =
180             size_hint::mul_scalar(size_hint::min(curr_hint, next_hint), 2);
181         let lower = if curr_lower > next_lower {
182             combined_lower + 1
183         } else {
184             combined_lower
185         };
186         let upper = {
187             let extra_elem = match (curr_upper, next_upper) {
188                 (_, None) => false,
189                 (None, Some(_)) => true,
190                 (Some(curr_max), Some(next_max)) => curr_max > next_max,
191             };
192             if extra_elem {
193                 combined_upper.and_then(|x| x.checked_add(1))
194             } else {
195                 combined_upper
196             }
197         };
198         (lower, upper)
199     }
200 
fold<B, F>(self, mut init: B, mut f: F) -> B where F: FnMut(B, Self::Item) -> B,201     fn fold<B, F>(self, mut init: B, mut f: F) -> B
202     where
203         F: FnMut(B, Self::Item) -> B,
204     {
205         let Self {
206             mut i,
207             mut j,
208             next_coming_from_j,
209         } = self;
210         if next_coming_from_j {
211             match j.next() {
212                 Some(y) => init = f(init, y),
213                 None => return init,
214             }
215         }
216         let res = i.try_fold(init, |mut acc, x| {
217             acc = f(acc, x);
218             match j.next() {
219                 Some(y) => Ok(f(acc, y)),
220                 None => Err(acc),
221             }
222         });
223         match res {
224             Ok(val) => val,
225             Err(val) => val,
226         }
227     }
228 }
229 
230 impl<I, J> FusedIterator for InterleaveShortest<I, J>
231 where
232     I: FusedIterator,
233     J: FusedIterator<Item = I::Item>,
234 {
235 }
236 
237 #[derive(Clone, Debug)]
238 /// An iterator adaptor that allows putting back a single
239 /// item to the front of the iterator.
240 ///
241 /// Iterator element type is `I::Item`.
242 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
243 pub struct PutBack<I>
244 where
245     I: Iterator,
246 {
247     top: Option<I::Item>,
248     iter: I,
249 }
250 
251 /// Create an iterator where you can put back a single item
put_back<I>(iterable: I) -> PutBack<I::IntoIter> where I: IntoIterator,252 pub fn put_back<I>(iterable: I) -> PutBack<I::IntoIter>
253 where
254     I: IntoIterator,
255 {
256     PutBack {
257         top: None,
258         iter: iterable.into_iter(),
259     }
260 }
261 
262 impl<I> PutBack<I>
263 where
264     I: Iterator,
265 {
266     /// put back value `value` (builder method)
with_value(mut self, value: I::Item) -> Self267     pub fn with_value(mut self, value: I::Item) -> Self {
268         self.put_back(value);
269         self
270     }
271 
272     /// Split the `PutBack` into its parts.
273     #[inline]
into_parts(self) -> (Option<I::Item>, I)274     pub fn into_parts(self) -> (Option<I::Item>, I) {
275         let Self { top, iter } = self;
276         (top, iter)
277     }
278 
279     /// Put back a single value to the front of the iterator.
280     ///
281     /// If a value is already in the put back slot, it is returned.
282     #[inline]
put_back(&mut self, x: I::Item) -> Option<I::Item>283     pub fn put_back(&mut self, x: I::Item) -> Option<I::Item> {
284         self.top.replace(x)
285     }
286 }
287 
288 impl<I> Iterator for PutBack<I>
289 where
290     I: Iterator,
291 {
292     type Item = I::Item;
293     #[inline]
next(&mut self) -> Option<Self::Item>294     fn next(&mut self) -> Option<Self::Item> {
295         match self.top {
296             None => self.iter.next(),
297             ref mut some => some.take(),
298         }
299     }
300     #[inline]
size_hint(&self) -> (usize, Option<usize>)301     fn size_hint(&self) -> (usize, Option<usize>) {
302         // Not ExactSizeIterator because size may be larger than usize
303         size_hint::add_scalar(self.iter.size_hint(), self.top.is_some() as usize)
304     }
305 
count(self) -> usize306     fn count(self) -> usize {
307         self.iter.count() + (self.top.is_some() as usize)
308     }
309 
last(self) -> Option<Self::Item>310     fn last(self) -> Option<Self::Item> {
311         self.iter.last().or(self.top)
312     }
313 
nth(&mut self, n: usize) -> Option<Self::Item>314     fn nth(&mut self, n: usize) -> Option<Self::Item> {
315         match self.top {
316             None => self.iter.nth(n),
317             ref mut some => {
318                 if n == 0 {
319                     some.take()
320                 } else {
321                     *some = None;
322                     self.iter.nth(n - 1)
323                 }
324             }
325         }
326     }
327 
all<G>(&mut self, mut f: G) -> bool where G: FnMut(Self::Item) -> bool,328     fn all<G>(&mut self, mut f: G) -> bool
329     where
330         G: FnMut(Self::Item) -> bool,
331     {
332         if let Some(elt) = self.top.take() {
333             if !f(elt) {
334                 return false;
335             }
336         }
337         self.iter.all(f)
338     }
339 
fold<Acc, G>(mut self, init: Acc, mut f: G) -> Acc where G: FnMut(Acc, Self::Item) -> Acc,340     fn fold<Acc, G>(mut self, init: Acc, mut f: G) -> Acc
341     where
342         G: FnMut(Acc, Self::Item) -> Acc,
343     {
344         let mut accum = init;
345         if let Some(elt) = self.top.take() {
346             accum = f(accum, elt);
347         }
348         self.iter.fold(accum, f)
349     }
350 }
351 
352 #[derive(Debug, Clone)]
353 /// An iterator adaptor that iterates over the cartesian product of
354 /// the element sets of two iterators `I` and `J`.
355 ///
356 /// Iterator element type is `(I::Item, J::Item)`.
357 ///
358 /// See [`.cartesian_product()`](crate::Itertools::cartesian_product) for more information.
359 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
360 pub struct Product<I, J>
361 where
362     I: Iterator,
363 {
364     a: I,
365     /// `a_cur` is `None` while no item have been taken out of `a` (at definition).
366     /// Then `a_cur` will be `Some(Some(item))` until `a` is exhausted,
367     /// in which case `a_cur` will be `Some(None)`.
368     a_cur: Option<Option<I::Item>>,
369     b: J,
370     b_orig: J,
371 }
372 
373 /// Create a new cartesian product iterator
374 ///
375 /// Iterator element type is `(I::Item, J::Item)`.
cartesian_product<I, J>(i: I, j: J) -> Product<I, J> where I: Iterator, J: Clone + Iterator, I::Item: Clone,376 pub fn cartesian_product<I, J>(i: I, j: J) -> Product<I, J>
377 where
378     I: Iterator,
379     J: Clone + Iterator,
380     I::Item: Clone,
381 {
382     Product {
383         a_cur: None,
384         a: i,
385         b: j.clone(),
386         b_orig: j,
387     }
388 }
389 
390 impl<I, J> Iterator for Product<I, J>
391 where
392     I: Iterator,
393     J: Clone + Iterator,
394     I::Item: Clone,
395 {
396     type Item = (I::Item, J::Item);
397 
next(&mut self) -> Option<Self::Item>398     fn next(&mut self) -> Option<Self::Item> {
399         let Self {
400             a,
401             a_cur,
402             b,
403             b_orig,
404         } = self;
405         let elt_b = match b.next() {
406             None => {
407                 *b = b_orig.clone();
408                 match b.next() {
409                     None => return None,
410                     Some(x) => {
411                         *a_cur = Some(a.next());
412                         x
413                     }
414                 }
415             }
416             Some(x) => x,
417         };
418         a_cur
419             .get_or_insert_with(|| a.next())
420             .as_ref()
421             .map(|a| (a.clone(), elt_b))
422     }
423 
size_hint(&self) -> (usize, Option<usize>)424     fn size_hint(&self) -> (usize, Option<usize>) {
425         // Not ExactSizeIterator because size may be larger than usize
426         // Compute a * b_orig + b for both lower and upper bound
427         let mut sh = size_hint::mul(self.a.size_hint(), self.b_orig.size_hint());
428         if matches!(self.a_cur, Some(Some(_))) {
429             sh = size_hint::add(sh, self.b.size_hint());
430         }
431         sh
432     }
433 
fold<Acc, G>(self, mut accum: Acc, mut f: G) -> Acc where G: FnMut(Acc, Self::Item) -> Acc,434     fn fold<Acc, G>(self, mut accum: Acc, mut f: G) -> Acc
435     where
436         G: FnMut(Acc, Self::Item) -> Acc,
437     {
438         // use a split loop to handle the loose a_cur as well as avoiding to
439         // clone b_orig at the end.
440         let Self {
441             mut a,
442             a_cur,
443             mut b,
444             b_orig,
445         } = self;
446         if let Some(mut elt_a) = a_cur.unwrap_or_else(|| a.next()) {
447             loop {
448                 accum = b.fold(accum, |acc, elt| f(acc, (elt_a.clone(), elt)));
449 
450                 // we can only continue iterating a if we had a first element;
451                 if let Some(next_elt_a) = a.next() {
452                     b = b_orig.clone();
453                     elt_a = next_elt_a;
454                 } else {
455                     break;
456                 }
457             }
458         }
459         accum
460     }
461 }
462 
463 impl<I, J> FusedIterator for Product<I, J>
464 where
465     I: FusedIterator,
466     J: Clone + FusedIterator,
467     I::Item: Clone,
468 {
469 }
470 
471 /// A “meta iterator adaptor”. Its closure receives a reference to the iterator
472 /// and may pick off as many elements as it likes, to produce the next iterator element.
473 ///
474 /// Iterator element type is `X` if the return type of `F` is `Option<X>`.
475 ///
476 /// See [`.batching()`](crate::Itertools::batching) for more information.
477 #[derive(Clone)]
478 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
479 pub struct Batching<I, F> {
480     f: F,
481     iter: I,
482 }
483 
484 impl<I, F> fmt::Debug for Batching<I, F>
485 where
486     I: fmt::Debug,
487 {
488     debug_fmt_fields!(Batching, iter);
489 }
490 
491 /// Create a new Batching iterator.
batching<I, F>(iter: I, f: F) -> Batching<I, F>492 pub fn batching<I, F>(iter: I, f: F) -> Batching<I, F> {
493     Batching { f, iter }
494 }
495 
496 impl<B, F, I> Iterator for Batching<I, F>
497 where
498     I: Iterator,
499     F: FnMut(&mut I) -> Option<B>,
500 {
501     type Item = B;
502     #[inline]
next(&mut self) -> Option<Self::Item>503     fn next(&mut self) -> Option<Self::Item> {
504         (self.f)(&mut self.iter)
505     }
506 }
507 
508 /// An iterator adaptor that borrows from a `Clone`-able iterator
509 /// to only pick off elements while the predicate returns `true`.
510 ///
511 /// See [`.take_while_ref()`](crate::Itertools::take_while_ref) for more information.
512 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
513 pub struct TakeWhileRef<'a, I: 'a, F> {
514     iter: &'a mut I,
515     f: F,
516 }
517 
518 impl<'a, I, F> fmt::Debug for TakeWhileRef<'a, I, F>
519 where
520     I: Iterator + fmt::Debug,
521 {
522     debug_fmt_fields!(TakeWhileRef, iter);
523 }
524 
525 /// Create a new `TakeWhileRef` from a reference to clonable iterator.
take_while_ref<I, F>(iter: &mut I, f: F) -> TakeWhileRef<I, F> where I: Iterator + Clone,526 pub fn take_while_ref<I, F>(iter: &mut I, f: F) -> TakeWhileRef<I, F>
527 where
528     I: Iterator + Clone,
529 {
530     TakeWhileRef { iter, f }
531 }
532 
533 impl<'a, I, F> Iterator for TakeWhileRef<'a, I, F>
534 where
535     I: Iterator + Clone,
536     F: FnMut(&I::Item) -> bool,
537 {
538     type Item = I::Item;
539 
next(&mut self) -> Option<Self::Item>540     fn next(&mut self) -> Option<Self::Item> {
541         let old = self.iter.clone();
542         match self.iter.next() {
543             None => None,
544             Some(elt) => {
545                 if (self.f)(&elt) {
546                     Some(elt)
547                 } else {
548                     *self.iter = old;
549                     None
550                 }
551             }
552         }
553     }
554 
size_hint(&self) -> (usize, Option<usize>)555     fn size_hint(&self) -> (usize, Option<usize>) {
556         (0, self.iter.size_hint().1)
557     }
558 }
559 
560 /// An iterator adaptor that filters `Option<A>` iterator elements
561 /// and produces `A`. Stops on the first `None` encountered.
562 ///
563 /// See [`.while_some()`](crate::Itertools::while_some) for more information.
564 #[derive(Clone, Debug)]
565 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
566 pub struct WhileSome<I> {
567     iter: I,
568 }
569 
570 /// Create a new `WhileSome<I>`.
while_some<I>(iter: I) -> WhileSome<I>571 pub fn while_some<I>(iter: I) -> WhileSome<I> {
572     WhileSome { iter }
573 }
574 
575 impl<I, A> Iterator for WhileSome<I>
576 where
577     I: Iterator<Item = Option<A>>,
578 {
579     type Item = A;
580 
next(&mut self) -> Option<Self::Item>581     fn next(&mut self) -> Option<Self::Item> {
582         match self.iter.next() {
583             None | Some(None) => None,
584             Some(elt) => elt,
585         }
586     }
587 
size_hint(&self) -> (usize, Option<usize>)588     fn size_hint(&self) -> (usize, Option<usize>) {
589         (0, self.iter.size_hint().1)
590     }
591 
fold<B, F>(mut self, acc: B, mut f: F) -> B where Self: Sized, F: FnMut(B, Self::Item) -> B,592     fn fold<B, F>(mut self, acc: B, mut f: F) -> B
593     where
594         Self: Sized,
595         F: FnMut(B, Self::Item) -> B,
596     {
597         let res = self.iter.try_fold(acc, |acc, item| match item {
598             Some(item) => Ok(f(acc, item)),
599             None => Err(acc),
600         });
601 
602         match res {
603             Ok(val) => val,
604             Err(val) => val,
605         }
606     }
607 }
608 
609 /// An iterator to iterate through all combinations in a `Clone`-able iterator that produces tuples
610 /// of a specific size.
611 ///
612 /// See [`.tuple_combinations()`](crate::Itertools::tuple_combinations) for more
613 /// information.
614 #[derive(Clone, Debug)]
615 #[must_use = "this iterator adaptor is not lazy but does nearly nothing unless consumed"]
616 pub struct TupleCombinations<I, T>
617 where
618     I: Iterator,
619     T: HasCombination<I>,
620 {
621     iter: T::Combination,
622     _mi: PhantomData<I>,
623 }
624 
625 pub trait HasCombination<I>: Sized {
626     type Combination: From<I> + Iterator<Item = Self>;
627 }
628 
629 /// Create a new `TupleCombinations` from a clonable iterator.
tuple_combinations<T, I>(iter: I) -> TupleCombinations<I, T> where I: Iterator + Clone, I::Item: Clone, T: HasCombination<I>,630 pub fn tuple_combinations<T, I>(iter: I) -> TupleCombinations<I, T>
631 where
632     I: Iterator + Clone,
633     I::Item: Clone,
634     T: HasCombination<I>,
635 {
636     TupleCombinations {
637         iter: T::Combination::from(iter),
638         _mi: PhantomData,
639     }
640 }
641 
642 impl<I, T> Iterator for TupleCombinations<I, T>
643 where
644     I: Iterator,
645     T: HasCombination<I>,
646 {
647     type Item = T;
648 
next(&mut self) -> Option<Self::Item>649     fn next(&mut self) -> Option<Self::Item> {
650         self.iter.next()
651     }
652 
size_hint(&self) -> SizeHint653     fn size_hint(&self) -> SizeHint {
654         self.iter.size_hint()
655     }
656 
count(self) -> usize657     fn count(self) -> usize {
658         self.iter.count()
659     }
660 
fold<B, F>(self, init: B, f: F) -> B where F: FnMut(B, Self::Item) -> B,661     fn fold<B, F>(self, init: B, f: F) -> B
662     where
663         F: FnMut(B, Self::Item) -> B,
664     {
665         self.iter.fold(init, f)
666     }
667 }
668 
669 impl<I, T> FusedIterator for TupleCombinations<I, T>
670 where
671     I: FusedIterator,
672     T: HasCombination<I>,
673 {
674 }
675 
676 #[derive(Clone, Debug)]
677 pub struct Tuple1Combination<I> {
678     iter: I,
679 }
680 
681 impl<I> From<I> for Tuple1Combination<I> {
from(iter: I) -> Self682     fn from(iter: I) -> Self {
683         Self { iter }
684     }
685 }
686 
687 impl<I: Iterator> Iterator for Tuple1Combination<I> {
688     type Item = (I::Item,);
689 
next(&mut self) -> Option<Self::Item>690     fn next(&mut self) -> Option<Self::Item> {
691         self.iter.next().map(|x| (x,))
692     }
693 
size_hint(&self) -> SizeHint694     fn size_hint(&self) -> SizeHint {
695         self.iter.size_hint()
696     }
697 
count(self) -> usize698     fn count(self) -> usize {
699         self.iter.count()
700     }
701 
fold<B, F>(self, init: B, f: F) -> B where F: FnMut(B, Self::Item) -> B,702     fn fold<B, F>(self, init: B, f: F) -> B
703     where
704         F: FnMut(B, Self::Item) -> B,
705     {
706         self.iter.map(|x| (x,)).fold(init, f)
707     }
708 }
709 
710 impl<I: Iterator> HasCombination<I> for (I::Item,) {
711     type Combination = Tuple1Combination<I>;
712 }
713 
714 macro_rules! impl_tuple_combination {
715     ($C:ident $P:ident ; $($X:ident)*) => (
716         #[derive(Clone, Debug)]
717         pub struct $C<I: Iterator> {
718             item: Option<I::Item>,
719             iter: I,
720             c: $P<I>,
721         }
722 
723         impl<I: Iterator + Clone> From<I> for $C<I> {
724             fn from(mut iter: I) -> Self {
725                 Self {
726                     item: iter.next(),
727                     iter: iter.clone(),
728                     c: iter.into(),
729                 }
730             }
731         }
732 
733         impl<I: Iterator + Clone> From<I> for $C<Fuse<I>> {
734             fn from(iter: I) -> Self {
735                 Self::from(iter.fuse())
736             }
737         }
738 
739         impl<I, A> Iterator for $C<I>
740             where I: Iterator<Item = A> + Clone,
741                   A: Clone,
742         {
743             type Item = (A, $(ignore_ident!($X, A)),*);
744 
745             fn next(&mut self) -> Option<Self::Item> {
746                 if let Some(($($X,)*)) = self.c.next() {
747                     let z = self.item.clone().unwrap();
748                     Some((z, $($X),*))
749                 } else {
750                     self.item = self.iter.next();
751                     self.item.clone().and_then(|z| {
752                         self.c = self.iter.clone().into();
753                         self.c.next().map(|($($X,)*)| (z, $($X),*))
754                     })
755                 }
756             }
757 
758             fn size_hint(&self) -> SizeHint {
759                 const K: usize = 1 + count_ident!($($X)*);
760                 let (mut n_min, mut n_max) = self.iter.size_hint();
761                 n_min = checked_binomial(n_min, K).unwrap_or(usize::MAX);
762                 n_max = n_max.and_then(|n| checked_binomial(n, K));
763                 size_hint::add(self.c.size_hint(), (n_min, n_max))
764             }
765 
766             fn count(self) -> usize {
767                 const K: usize = 1 + count_ident!($($X)*);
768                 let n = self.iter.count();
769                 checked_binomial(n, K).unwrap() + self.c.count()
770             }
771 
772             fn fold<B, F>(self, mut init: B, mut f: F) -> B
773             where
774                 F: FnMut(B, Self::Item) -> B,
775             {
776                 let Self { c, item, mut iter } = self;
777                 if let Some(z) = item.as_ref() {
778                     init = c
779                         .map(|($($X,)*)| (z.clone(), $($X),*))
780                         .fold(init, &mut f);
781                 }
782                 while let Some(z) = iter.next() {
783                     let c: $P<I> = iter.clone().into();
784                     init = c
785                         .map(|($($X,)*)| (z.clone(), $($X),*))
786                         .fold(init, &mut f);
787                 }
788                 init
789             }
790         }
791 
792         impl<I, A> HasCombination<I> for (A, $(ignore_ident!($X, A)),*)
793             where I: Iterator<Item = A> + Clone,
794                   I::Item: Clone
795         {
796             type Combination = $C<Fuse<I>>;
797         }
798     )
799 }
800 
801 // This snippet generates the twelve `impl_tuple_combination!` invocations:
802 //    use core::iter;
803 //    use itertools::Itertools;
804 //
805 //    for i in 2..=12 {
806 //        println!("impl_tuple_combination!(Tuple{arity}Combination Tuple{prev}Combination; {idents});",
807 //            arity = i,
808 //            prev = i - 1,
809 //            idents = ('a'..'z').take(i - 1).join(" "),
810 //        );
811 //    }
812 // It could probably be replaced by a bit more macro cleverness.
813 impl_tuple_combination!(Tuple2Combination Tuple1Combination; a);
814 impl_tuple_combination!(Tuple3Combination Tuple2Combination; a b);
815 impl_tuple_combination!(Tuple4Combination Tuple3Combination; a b c);
816 impl_tuple_combination!(Tuple5Combination Tuple4Combination; a b c d);
817 impl_tuple_combination!(Tuple6Combination Tuple5Combination; a b c d e);
818 impl_tuple_combination!(Tuple7Combination Tuple6Combination; a b c d e f);
819 impl_tuple_combination!(Tuple8Combination Tuple7Combination; a b c d e f g);
820 impl_tuple_combination!(Tuple9Combination Tuple8Combination; a b c d e f g h);
821 impl_tuple_combination!(Tuple10Combination Tuple9Combination; a b c d e f g h i);
822 impl_tuple_combination!(Tuple11Combination Tuple10Combination; a b c d e f g h i j);
823 impl_tuple_combination!(Tuple12Combination Tuple11Combination; a b c d e f g h i j k);
824 
825 // https://en.wikipedia.org/wiki/Binomial_coefficient#In_programming_languages
checked_binomial(mut n: usize, mut k: usize) -> Option<usize>826 pub(crate) fn checked_binomial(mut n: usize, mut k: usize) -> Option<usize> {
827     if n < k {
828         return Some(0);
829     }
830     // `factorial(n) / factorial(n - k) / factorial(k)` but trying to avoid it overflows:
831     k = (n - k).min(k); // symmetry
832     let mut c = 1;
833     for i in 1..=k {
834         c = (c / i)
835             .checked_mul(n)?
836             .checked_add((c % i).checked_mul(n)? / i)?;
837         n -= 1;
838     }
839     Some(c)
840 }
841 
842 #[test]
test_checked_binomial()843 fn test_checked_binomial() {
844     // With the first row: [1, 0, 0, ...] and the first column full of 1s, we check
845     // row by row the recurrence relation of binomials (which is an equivalent definition).
846     // For n >= 1 and k >= 1 we have:
847     //   binomial(n, k) == binomial(n - 1, k - 1) + binomial(n - 1, k)
848     const LIMIT: usize = 500;
849     let mut row = vec![Some(0); LIMIT + 1];
850     row[0] = Some(1);
851     for n in 0..=LIMIT {
852         for k in 0..=LIMIT {
853             assert_eq!(row[k], checked_binomial(n, k));
854         }
855         row = std::iter::once(Some(1))
856             .chain((1..=LIMIT).map(|k| row[k - 1]?.checked_add(row[k]?)))
857             .collect();
858     }
859 }
860 
861 /// An iterator adapter to filter values within a nested `Result::Ok`.
862 ///
863 /// See [`.filter_ok()`](crate::Itertools::filter_ok) for more information.
864 #[derive(Clone)]
865 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
866 pub struct FilterOk<I, F> {
867     iter: I,
868     f: F,
869 }
870 
871 impl<I, F> fmt::Debug for FilterOk<I, F>
872 where
873     I: fmt::Debug,
874 {
875     debug_fmt_fields!(FilterOk, iter);
876 }
877 
878 /// Create a new `FilterOk` iterator.
filter_ok<I, F, T, E>(iter: I, f: F) -> FilterOk<I, F> where I: Iterator<Item = Result<T, E>>, F: FnMut(&T) -> bool,879 pub fn filter_ok<I, F, T, E>(iter: I, f: F) -> FilterOk<I, F>
880 where
881     I: Iterator<Item = Result<T, E>>,
882     F: FnMut(&T) -> bool,
883 {
884     FilterOk { iter, f }
885 }
886 
887 impl<I, F, T, E> Iterator for FilterOk<I, F>
888 where
889     I: Iterator<Item = Result<T, E>>,
890     F: FnMut(&T) -> bool,
891 {
892     type Item = Result<T, E>;
893 
next(&mut self) -> Option<Self::Item>894     fn next(&mut self) -> Option<Self::Item> {
895         let f = &mut self.f;
896         self.iter.find(|res| match res {
897             Ok(t) => f(t),
898             _ => true,
899         })
900     }
901 
size_hint(&self) -> (usize, Option<usize>)902     fn size_hint(&self) -> (usize, Option<usize>) {
903         (0, self.iter.size_hint().1)
904     }
905 
fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc,906     fn fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
907     where
908         Fold: FnMut(Acc, Self::Item) -> Acc,
909     {
910         let mut f = self.f;
911         self.iter
912             .filter(|v| v.as_ref().map(&mut f).unwrap_or(true))
913             .fold(init, fold_f)
914     }
915 
collect<C>(self) -> C where C: FromIterator<Self::Item>,916     fn collect<C>(self) -> C
917     where
918         C: FromIterator<Self::Item>,
919     {
920         let mut f = self.f;
921         self.iter
922             .filter(|v| v.as_ref().map(&mut f).unwrap_or(true))
923             .collect()
924     }
925 }
926 
927 impl<I, F, T, E> FusedIterator for FilterOk<I, F>
928 where
929     I: FusedIterator<Item = Result<T, E>>,
930     F: FnMut(&T) -> bool,
931 {
932 }
933 
934 /// An iterator adapter to filter and apply a transformation on values within a nested `Result::Ok`.
935 ///
936 /// See [`.filter_map_ok()`](crate::Itertools::filter_map_ok) for more information.
937 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
938 #[derive(Clone)]
939 pub struct FilterMapOk<I, F> {
940     iter: I,
941     f: F,
942 }
943 
944 impl<I, F> fmt::Debug for FilterMapOk<I, F>
945 where
946     I: fmt::Debug,
947 {
948     debug_fmt_fields!(FilterMapOk, iter);
949 }
950 
transpose_result<T, E>(result: Result<Option<T>, E>) -> Option<Result<T, E>>951 fn transpose_result<T, E>(result: Result<Option<T>, E>) -> Option<Result<T, E>> {
952     match result {
953         Ok(Some(v)) => Some(Ok(v)),
954         Ok(None) => None,
955         Err(e) => Some(Err(e)),
956     }
957 }
958 
959 /// Create a new `FilterOk` iterator.
filter_map_ok<I, F, T, U, E>(iter: I, f: F) -> FilterMapOk<I, F> where I: Iterator<Item = Result<T, E>>, F: FnMut(T) -> Option<U>,960 pub fn filter_map_ok<I, F, T, U, E>(iter: I, f: F) -> FilterMapOk<I, F>
961 where
962     I: Iterator<Item = Result<T, E>>,
963     F: FnMut(T) -> Option<U>,
964 {
965     FilterMapOk { iter, f }
966 }
967 
968 impl<I, F, T, U, E> Iterator for FilterMapOk<I, F>
969 where
970     I: Iterator<Item = Result<T, E>>,
971     F: FnMut(T) -> Option<U>,
972 {
973     type Item = Result<U, E>;
974 
next(&mut self) -> Option<Self::Item>975     fn next(&mut self) -> Option<Self::Item> {
976         let f = &mut self.f;
977         self.iter.find_map(|res| match res {
978             Ok(t) => f(t).map(Ok),
979             Err(e) => Some(Err(e)),
980         })
981     }
982 
size_hint(&self) -> (usize, Option<usize>)983     fn size_hint(&self) -> (usize, Option<usize>) {
984         (0, self.iter.size_hint().1)
985     }
986 
fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc,987     fn fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
988     where
989         Fold: FnMut(Acc, Self::Item) -> Acc,
990     {
991         let mut f = self.f;
992         self.iter
993             .filter_map(|v| transpose_result(v.map(&mut f)))
994             .fold(init, fold_f)
995     }
996 
collect<C>(self) -> C where C: FromIterator<Self::Item>,997     fn collect<C>(self) -> C
998     where
999         C: FromIterator<Self::Item>,
1000     {
1001         let mut f = self.f;
1002         self.iter
1003             .filter_map(|v| transpose_result(v.map(&mut f)))
1004             .collect()
1005     }
1006 }
1007 
1008 impl<I, F, T, U, E> FusedIterator for FilterMapOk<I, F>
1009 where
1010     I: FusedIterator<Item = Result<T, E>>,
1011     F: FnMut(T) -> Option<U>,
1012 {
1013 }
1014 
1015 /// An iterator adapter to get the positions of each element that matches a predicate.
1016 ///
1017 /// See [`.positions()`](crate::Itertools::positions) for more information.
1018 #[derive(Clone)]
1019 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
1020 pub struct Positions<I, F> {
1021     iter: Enumerate<I>,
1022     f: F,
1023 }
1024 
1025 impl<I, F> fmt::Debug for Positions<I, F>
1026 where
1027     I: fmt::Debug,
1028 {
1029     debug_fmt_fields!(Positions, iter);
1030 }
1031 
1032 /// Create a new `Positions` iterator.
positions<I, F>(iter: I, f: F) -> Positions<I, F> where I: Iterator, F: FnMut(I::Item) -> bool,1033 pub fn positions<I, F>(iter: I, f: F) -> Positions<I, F>
1034 where
1035     I: Iterator,
1036     F: FnMut(I::Item) -> bool,
1037 {
1038     let iter = iter.enumerate();
1039     Positions { iter, f }
1040 }
1041 
1042 impl<I, F> Iterator for Positions<I, F>
1043 where
1044     I: Iterator,
1045     F: FnMut(I::Item) -> bool,
1046 {
1047     type Item = usize;
1048 
next(&mut self) -> Option<Self::Item>1049     fn next(&mut self) -> Option<Self::Item> {
1050         let f = &mut self.f;
1051         // TODO: once MSRV >= 1.62, use `then_some`.
1052         self.iter
1053             .find_map(|(count, val)| if f(val) { Some(count) } else { None })
1054     }
1055 
size_hint(&self) -> (usize, Option<usize>)1056     fn size_hint(&self) -> (usize, Option<usize>) {
1057         (0, self.iter.size_hint().1)
1058     }
1059 
fold<B, G>(self, init: B, mut func: G) -> B where G: FnMut(B, Self::Item) -> B,1060     fn fold<B, G>(self, init: B, mut func: G) -> B
1061     where
1062         G: FnMut(B, Self::Item) -> B,
1063     {
1064         let mut f = self.f;
1065         self.iter.fold(init, |mut acc, (count, val)| {
1066             if f(val) {
1067                 acc = func(acc, count);
1068             }
1069             acc
1070         })
1071     }
1072 }
1073 
1074 impl<I, F> DoubleEndedIterator for Positions<I, F>
1075 where
1076     I: DoubleEndedIterator + ExactSizeIterator,
1077     F: FnMut(I::Item) -> bool,
1078 {
next_back(&mut self) -> Option<Self::Item>1079     fn next_back(&mut self) -> Option<Self::Item> {
1080         let f = &mut self.f;
1081         // TODO: once MSRV >= 1.62, use `then_some`.
1082         self.iter
1083             .by_ref()
1084             .rev()
1085             .find_map(|(count, val)| if f(val) { Some(count) } else { None })
1086     }
1087 
rfold<B, G>(self, init: B, mut func: G) -> B where G: FnMut(B, Self::Item) -> B,1088     fn rfold<B, G>(self, init: B, mut func: G) -> B
1089     where
1090         G: FnMut(B, Self::Item) -> B,
1091     {
1092         let mut f = self.f;
1093         self.iter.rfold(init, |mut acc, (count, val)| {
1094             if f(val) {
1095                 acc = func(acc, count);
1096             }
1097             acc
1098         })
1099     }
1100 }
1101 
1102 impl<I, F> FusedIterator for Positions<I, F>
1103 where
1104     I: FusedIterator,
1105     F: FnMut(I::Item) -> bool,
1106 {
1107 }
1108 
1109 /// An iterator adapter to apply a mutating function to each element before yielding it.
1110 ///
1111 /// See [`.update()`](crate::Itertools::update) for more information.
1112 #[derive(Clone)]
1113 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
1114 pub struct Update<I, F> {
1115     iter: I,
1116     f: F,
1117 }
1118 
1119 impl<I, F> fmt::Debug for Update<I, F>
1120 where
1121     I: fmt::Debug,
1122 {
1123     debug_fmt_fields!(Update, iter);
1124 }
1125 
1126 /// Create a new `Update` iterator.
update<I, F>(iter: I, f: F) -> Update<I, F> where I: Iterator, F: FnMut(&mut I::Item),1127 pub fn update<I, F>(iter: I, f: F) -> Update<I, F>
1128 where
1129     I: Iterator,
1130     F: FnMut(&mut I::Item),
1131 {
1132     Update { iter, f }
1133 }
1134 
1135 impl<I, F> Iterator for Update<I, F>
1136 where
1137     I: Iterator,
1138     F: FnMut(&mut I::Item),
1139 {
1140     type Item = I::Item;
1141 
next(&mut self) -> Option<Self::Item>1142     fn next(&mut self) -> Option<Self::Item> {
1143         if let Some(mut v) = self.iter.next() {
1144             (self.f)(&mut v);
1145             Some(v)
1146         } else {
1147             None
1148         }
1149     }
1150 
size_hint(&self) -> (usize, Option<usize>)1151     fn size_hint(&self) -> (usize, Option<usize>) {
1152         self.iter.size_hint()
1153     }
1154 
fold<Acc, G>(self, init: Acc, mut g: G) -> Acc where G: FnMut(Acc, Self::Item) -> Acc,1155     fn fold<Acc, G>(self, init: Acc, mut g: G) -> Acc
1156     where
1157         G: FnMut(Acc, Self::Item) -> Acc,
1158     {
1159         let mut f = self.f;
1160         self.iter.fold(init, move |acc, mut v| {
1161             f(&mut v);
1162             g(acc, v)
1163         })
1164     }
1165 
1166     // if possible, re-use inner iterator specializations in collect
collect<C>(self) -> C where C: FromIterator<Self::Item>,1167     fn collect<C>(self) -> C
1168     where
1169         C: FromIterator<Self::Item>,
1170     {
1171         let mut f = self.f;
1172         self.iter
1173             .map(move |mut v| {
1174                 f(&mut v);
1175                 v
1176             })
1177             .collect()
1178     }
1179 }
1180 
1181 impl<I, F> ExactSizeIterator for Update<I, F>
1182 where
1183     I: ExactSizeIterator,
1184     F: FnMut(&mut I::Item),
1185 {
1186 }
1187 
1188 impl<I, F> DoubleEndedIterator for Update<I, F>
1189 where
1190     I: DoubleEndedIterator,
1191     F: FnMut(&mut I::Item),
1192 {
next_back(&mut self) -> Option<Self::Item>1193     fn next_back(&mut self) -> Option<Self::Item> {
1194         if let Some(mut v) = self.iter.next_back() {
1195             (self.f)(&mut v);
1196             Some(v)
1197         } else {
1198             None
1199         }
1200     }
1201 }
1202 
1203 impl<I, F> FusedIterator for Update<I, F>
1204 where
1205     I: FusedIterator,
1206     F: FnMut(&mut I::Item),
1207 {
1208 }
1209