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<I, F> fmt::Debug for TakeWhileRef<'_, 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<I, F> Iterator for TakeWhileRef<'_, 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 // We outline this closure to prevent it from unnecessarily
777 // capturing the type parameters `I`, `B`, and `F`. Not doing
778 // so ended up causing exponentially big types during MIR
779 // inlining when building itertools with optimizations enabled.
780 //
781 // This change causes a small improvement to compile times in
782 // release mode.
783 type CurrTuple<A> = (A, $(ignore_ident!($X, A)),*);
784 type PrevTuple<A> = ($(ignore_ident!($X, A),)*);
785 fn map_fn<A: Clone>(z: &A) -> impl FnMut(PrevTuple<A>) -> CurrTuple<A> + '_ {
786 move |($($X,)*)| (z.clone(), $($X),*)
787 }
788 let Self { c, item, mut iter } = self;
789 if let Some(z) = item.as_ref() {
790 init = c
791 .map(map_fn::<A>(z))
792 .fold(init, &mut f);
793 }
794 while let Some(z) = iter.next() {
795 let c: $P<I> = iter.clone().into();
796 init = c
797 .map(map_fn::<A>(&z))
798 .fold(init, &mut f);
799 }
800 init
801 }
802 }
803
804 impl<I, A> HasCombination<I> for (A, $(ignore_ident!($X, A)),*)
805 where I: Iterator<Item = A> + Clone,
806 I::Item: Clone
807 {
808 type Combination = $C<Fuse<I>>;
809 }
810 )
811 }
812
813 // This snippet generates the twelve `impl_tuple_combination!` invocations:
814 // use core::iter;
815 // use itertools::Itertools;
816 //
817 // for i in 2..=12 {
818 // println!("impl_tuple_combination!(Tuple{arity}Combination Tuple{prev}Combination; {idents});",
819 // arity = i,
820 // prev = i - 1,
821 // idents = ('a'..'z').take(i - 1).join(" "),
822 // );
823 // }
824 // It could probably be replaced by a bit more macro cleverness.
825 impl_tuple_combination!(Tuple2Combination Tuple1Combination; a);
826 impl_tuple_combination!(Tuple3Combination Tuple2Combination; a b);
827 impl_tuple_combination!(Tuple4Combination Tuple3Combination; a b c);
828 impl_tuple_combination!(Tuple5Combination Tuple4Combination; a b c d);
829 impl_tuple_combination!(Tuple6Combination Tuple5Combination; a b c d e);
830 impl_tuple_combination!(Tuple7Combination Tuple6Combination; a b c d e f);
831 impl_tuple_combination!(Tuple8Combination Tuple7Combination; a b c d e f g);
832 impl_tuple_combination!(Tuple9Combination Tuple8Combination; a b c d e f g h);
833 impl_tuple_combination!(Tuple10Combination Tuple9Combination; a b c d e f g h i);
834 impl_tuple_combination!(Tuple11Combination Tuple10Combination; a b c d e f g h i j);
835 impl_tuple_combination!(Tuple12Combination Tuple11Combination; a b c d e f g h i j k);
836
837 // https://en.wikipedia.org/wiki/Binomial_coefficient#In_programming_languages
checked_binomial(mut n: usize, mut k: usize) -> Option<usize>838 pub(crate) fn checked_binomial(mut n: usize, mut k: usize) -> Option<usize> {
839 if n < k {
840 return Some(0);
841 }
842 // `factorial(n) / factorial(n - k) / factorial(k)` but trying to avoid it overflows:
843 k = (n - k).min(k); // symmetry
844 let mut c = 1;
845 for i in 1..=k {
846 c = (c / i)
847 .checked_mul(n)?
848 .checked_add((c % i).checked_mul(n)? / i)?;
849 n -= 1;
850 }
851 Some(c)
852 }
853
854 #[test]
test_checked_binomial()855 fn test_checked_binomial() {
856 // With the first row: [1, 0, 0, ...] and the first column full of 1s, we check
857 // row by row the recurrence relation of binomials (which is an equivalent definition).
858 // For n >= 1 and k >= 1 we have:
859 // binomial(n, k) == binomial(n - 1, k - 1) + binomial(n - 1, k)
860 const LIMIT: usize = 500;
861 let mut row = vec![Some(0); LIMIT + 1];
862 row[0] = Some(1);
863 for n in 0..=LIMIT {
864 for k in 0..=LIMIT {
865 assert_eq!(row[k], checked_binomial(n, k));
866 }
867 row = std::iter::once(Some(1))
868 .chain((1..=LIMIT).map(|k| row[k - 1]?.checked_add(row[k]?)))
869 .collect();
870 }
871 }
872
873 /// An iterator adapter to filter values within a nested `Result::Ok`.
874 ///
875 /// See [`.filter_ok()`](crate::Itertools::filter_ok) for more information.
876 #[derive(Clone)]
877 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
878 pub struct FilterOk<I, F> {
879 iter: I,
880 f: F,
881 }
882
883 impl<I, F> fmt::Debug for FilterOk<I, F>
884 where
885 I: fmt::Debug,
886 {
887 debug_fmt_fields!(FilterOk, iter);
888 }
889
890 /// 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,891 pub fn filter_ok<I, F, T, E>(iter: I, f: F) -> FilterOk<I, F>
892 where
893 I: Iterator<Item = Result<T, E>>,
894 F: FnMut(&T) -> bool,
895 {
896 FilterOk { iter, f }
897 }
898
899 impl<I, F, T, E> Iterator for FilterOk<I, F>
900 where
901 I: Iterator<Item = Result<T, E>>,
902 F: FnMut(&T) -> bool,
903 {
904 type Item = Result<T, E>;
905
next(&mut self) -> Option<Self::Item>906 fn next(&mut self) -> Option<Self::Item> {
907 let f = &mut self.f;
908 self.iter.find(|res| match res {
909 Ok(t) => f(t),
910 _ => true,
911 })
912 }
913
size_hint(&self) -> (usize, Option<usize>)914 fn size_hint(&self) -> (usize, Option<usize>) {
915 (0, self.iter.size_hint().1)
916 }
917
fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc,918 fn fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
919 where
920 Fold: FnMut(Acc, Self::Item) -> Acc,
921 {
922 let mut f = self.f;
923 self.iter
924 .filter(|v| v.as_ref().map(&mut f).unwrap_or(true))
925 .fold(init, fold_f)
926 }
927
collect<C>(self) -> C where C: FromIterator<Self::Item>,928 fn collect<C>(self) -> C
929 where
930 C: FromIterator<Self::Item>,
931 {
932 let mut f = self.f;
933 self.iter
934 .filter(|v| v.as_ref().map(&mut f).unwrap_or(true))
935 .collect()
936 }
937 }
938
939 impl<I, F, T, E> DoubleEndedIterator for FilterOk<I, F>
940 where
941 I: DoubleEndedIterator<Item = Result<T, E>>,
942 F: FnMut(&T) -> bool,
943 {
next_back(&mut self) -> Option<Self::Item>944 fn next_back(&mut self) -> Option<Self::Item> {
945 let f = &mut self.f;
946 self.iter.rfind(|res| match res {
947 Ok(t) => f(t),
948 _ => true,
949 })
950 }
951
rfold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc,952 fn rfold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
953 where
954 Fold: FnMut(Acc, Self::Item) -> Acc,
955 {
956 let mut f = self.f;
957 self.iter
958 .filter(|v| v.as_ref().map(&mut f).unwrap_or(true))
959 .rfold(init, fold_f)
960 }
961 }
962
963 impl<I, F, T, E> FusedIterator for FilterOk<I, F>
964 where
965 I: FusedIterator<Item = Result<T, E>>,
966 F: FnMut(&T) -> bool,
967 {
968 }
969
970 /// An iterator adapter to filter and apply a transformation on values within a nested `Result::Ok`.
971 ///
972 /// See [`.filter_map_ok()`](crate::Itertools::filter_map_ok) for more information.
973 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
974 #[derive(Clone)]
975 pub struct FilterMapOk<I, F> {
976 iter: I,
977 f: F,
978 }
979
980 impl<I, F> fmt::Debug for FilterMapOk<I, F>
981 where
982 I: fmt::Debug,
983 {
984 debug_fmt_fields!(FilterMapOk, iter);
985 }
986
transpose_result<T, E>(result: Result<Option<T>, E>) -> Option<Result<T, E>>987 fn transpose_result<T, E>(result: Result<Option<T>, E>) -> Option<Result<T, E>> {
988 match result {
989 Ok(Some(v)) => Some(Ok(v)),
990 Ok(None) => None,
991 Err(e) => Some(Err(e)),
992 }
993 }
994
995 /// 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>,996 pub fn filter_map_ok<I, F, T, U, E>(iter: I, f: F) -> FilterMapOk<I, F>
997 where
998 I: Iterator<Item = Result<T, E>>,
999 F: FnMut(T) -> Option<U>,
1000 {
1001 FilterMapOk { iter, f }
1002 }
1003
1004 impl<I, F, T, U, E> Iterator for FilterMapOk<I, F>
1005 where
1006 I: Iterator<Item = Result<T, E>>,
1007 F: FnMut(T) -> Option<U>,
1008 {
1009 type Item = Result<U, E>;
1010
next(&mut self) -> Option<Self::Item>1011 fn next(&mut self) -> Option<Self::Item> {
1012 let f = &mut self.f;
1013 self.iter.find_map(|res| match res {
1014 Ok(t) => f(t).map(Ok),
1015 Err(e) => Some(Err(e)),
1016 })
1017 }
1018
size_hint(&self) -> (usize, Option<usize>)1019 fn size_hint(&self) -> (usize, Option<usize>) {
1020 (0, self.iter.size_hint().1)
1021 }
1022
fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc,1023 fn fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
1024 where
1025 Fold: FnMut(Acc, Self::Item) -> Acc,
1026 {
1027 let mut f = self.f;
1028 self.iter
1029 .filter_map(|v| transpose_result(v.map(&mut f)))
1030 .fold(init, fold_f)
1031 }
1032
collect<C>(self) -> C where C: FromIterator<Self::Item>,1033 fn collect<C>(self) -> C
1034 where
1035 C: FromIterator<Self::Item>,
1036 {
1037 let mut f = self.f;
1038 self.iter
1039 .filter_map(|v| transpose_result(v.map(&mut f)))
1040 .collect()
1041 }
1042 }
1043
1044 impl<I, F, T, U, E> DoubleEndedIterator for FilterMapOk<I, F>
1045 where
1046 I: DoubleEndedIterator<Item = Result<T, E>>,
1047 F: FnMut(T) -> Option<U>,
1048 {
next_back(&mut self) -> Option<Self::Item>1049 fn next_back(&mut self) -> Option<Self::Item> {
1050 let f = &mut self.f;
1051 self.iter.by_ref().rev().find_map(|res| match res {
1052 Ok(t) => f(t).map(Ok),
1053 Err(e) => Some(Err(e)),
1054 })
1055 }
1056
rfold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc,1057 fn rfold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
1058 where
1059 Fold: FnMut(Acc, Self::Item) -> Acc,
1060 {
1061 let mut f = self.f;
1062 self.iter
1063 .filter_map(|v| transpose_result(v.map(&mut f)))
1064 .rfold(init, fold_f)
1065 }
1066 }
1067
1068 impl<I, F, T, U, E> FusedIterator for FilterMapOk<I, F>
1069 where
1070 I: FusedIterator<Item = Result<T, E>>,
1071 F: FnMut(T) -> Option<U>,
1072 {
1073 }
1074
1075 /// An iterator adapter to get the positions of each element that matches a predicate.
1076 ///
1077 /// See [`.positions()`](crate::Itertools::positions) for more information.
1078 #[derive(Clone)]
1079 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
1080 pub struct Positions<I, F> {
1081 iter: Enumerate<I>,
1082 f: F,
1083 }
1084
1085 impl<I, F> fmt::Debug for Positions<I, F>
1086 where
1087 I: fmt::Debug,
1088 {
1089 debug_fmt_fields!(Positions, iter);
1090 }
1091
1092 /// Create a new `Positions` iterator.
positions<I, F>(iter: I, f: F) -> Positions<I, F> where I: Iterator, F: FnMut(I::Item) -> bool,1093 pub fn positions<I, F>(iter: I, f: F) -> Positions<I, F>
1094 where
1095 I: Iterator,
1096 F: FnMut(I::Item) -> bool,
1097 {
1098 let iter = iter.enumerate();
1099 Positions { iter, f }
1100 }
1101
1102 impl<I, F> Iterator for Positions<I, F>
1103 where
1104 I: Iterator,
1105 F: FnMut(I::Item) -> bool,
1106 {
1107 type Item = usize;
1108
next(&mut self) -> Option<Self::Item>1109 fn next(&mut self) -> Option<Self::Item> {
1110 let f = &mut self.f;
1111 self.iter.find_map(|(count, val)| f(val).then_some(count))
1112 }
1113
size_hint(&self) -> (usize, Option<usize>)1114 fn size_hint(&self) -> (usize, Option<usize>) {
1115 (0, self.iter.size_hint().1)
1116 }
1117
fold<B, G>(self, init: B, mut func: G) -> B where G: FnMut(B, Self::Item) -> B,1118 fn fold<B, G>(self, init: B, mut func: G) -> B
1119 where
1120 G: FnMut(B, Self::Item) -> B,
1121 {
1122 let mut f = self.f;
1123 self.iter.fold(init, |mut acc, (count, val)| {
1124 if f(val) {
1125 acc = func(acc, count);
1126 }
1127 acc
1128 })
1129 }
1130 }
1131
1132 impl<I, F> DoubleEndedIterator for Positions<I, F>
1133 where
1134 I: DoubleEndedIterator + ExactSizeIterator,
1135 F: FnMut(I::Item) -> bool,
1136 {
next_back(&mut self) -> Option<Self::Item>1137 fn next_back(&mut self) -> Option<Self::Item> {
1138 let f = &mut self.f;
1139 self.iter
1140 .by_ref()
1141 .rev()
1142 .find_map(|(count, val)| f(val).then_some(count))
1143 }
1144
rfold<B, G>(self, init: B, mut func: G) -> B where G: FnMut(B, Self::Item) -> B,1145 fn rfold<B, G>(self, init: B, mut func: G) -> B
1146 where
1147 G: FnMut(B, Self::Item) -> B,
1148 {
1149 let mut f = self.f;
1150 self.iter.rfold(init, |mut acc, (count, val)| {
1151 if f(val) {
1152 acc = func(acc, count);
1153 }
1154 acc
1155 })
1156 }
1157 }
1158
1159 impl<I, F> FusedIterator for Positions<I, F>
1160 where
1161 I: FusedIterator,
1162 F: FnMut(I::Item) -> bool,
1163 {
1164 }
1165
1166 /// An iterator adapter to apply a mutating function to each element before yielding it.
1167 ///
1168 /// See [`.update()`](crate::Itertools::update) for more information.
1169 #[derive(Clone)]
1170 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
1171 pub struct Update<I, F> {
1172 iter: I,
1173 f: F,
1174 }
1175
1176 impl<I, F> fmt::Debug for Update<I, F>
1177 where
1178 I: fmt::Debug,
1179 {
1180 debug_fmt_fields!(Update, iter);
1181 }
1182
1183 /// Create a new `Update` iterator.
update<I, F>(iter: I, f: F) -> Update<I, F> where I: Iterator, F: FnMut(&mut I::Item),1184 pub fn update<I, F>(iter: I, f: F) -> Update<I, F>
1185 where
1186 I: Iterator,
1187 F: FnMut(&mut I::Item),
1188 {
1189 Update { iter, f }
1190 }
1191
1192 impl<I, F> Iterator for Update<I, F>
1193 where
1194 I: Iterator,
1195 F: FnMut(&mut I::Item),
1196 {
1197 type Item = I::Item;
1198
next(&mut self) -> Option<Self::Item>1199 fn next(&mut self) -> Option<Self::Item> {
1200 if let Some(mut v) = self.iter.next() {
1201 (self.f)(&mut v);
1202 Some(v)
1203 } else {
1204 None
1205 }
1206 }
1207
size_hint(&self) -> (usize, Option<usize>)1208 fn size_hint(&self) -> (usize, Option<usize>) {
1209 self.iter.size_hint()
1210 }
1211
fold<Acc, G>(self, init: Acc, mut g: G) -> Acc where G: FnMut(Acc, Self::Item) -> Acc,1212 fn fold<Acc, G>(self, init: Acc, mut g: G) -> Acc
1213 where
1214 G: FnMut(Acc, Self::Item) -> Acc,
1215 {
1216 let mut f = self.f;
1217 self.iter.fold(init, move |acc, mut v| {
1218 f(&mut v);
1219 g(acc, v)
1220 })
1221 }
1222
1223 // if possible, re-use inner iterator specializations in collect
collect<C>(self) -> C where C: FromIterator<Self::Item>,1224 fn collect<C>(self) -> C
1225 where
1226 C: FromIterator<Self::Item>,
1227 {
1228 let mut f = self.f;
1229 self.iter
1230 .map(move |mut v| {
1231 f(&mut v);
1232 v
1233 })
1234 .collect()
1235 }
1236 }
1237
1238 impl<I, F> ExactSizeIterator for Update<I, F>
1239 where
1240 I: ExactSizeIterator,
1241 F: FnMut(&mut I::Item),
1242 {
1243 }
1244
1245 impl<I, F> DoubleEndedIterator for Update<I, F>
1246 where
1247 I: DoubleEndedIterator,
1248 F: FnMut(&mut I::Item),
1249 {
next_back(&mut self) -> Option<Self::Item>1250 fn next_back(&mut self) -> Option<Self::Item> {
1251 if let Some(mut v) = self.iter.next_back() {
1252 (self.f)(&mut v);
1253 Some(v)
1254 } else {
1255 None
1256 }
1257 }
1258 }
1259
1260 impl<I, F> FusedIterator for Update<I, F>
1261 where
1262 I: FusedIterator,
1263 F: FnMut(&mut I::Item),
1264 {
1265 }
1266