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