// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! Composable external iterators //! //! # The `Iterator` trait //! //! This module defines Rust's core iteration trait. The `Iterator` trait has one //! unimplemented method, `next`. All other methods are derived through default //! methods to perform operations such as `zip`, `chain`, `enumerate`, and `fold`. //! //! The goal of this module is to unify iteration across all containers in Rust. //! An iterator can be considered as a state machine which is used to track which //! element will be yielded next. //! //! There are various extensions also defined in this module to assist with various //! types of iteration, such as the `DoubleEndedIterator` for iterating in reverse, //! the `FromIterator` trait for creating a container from an iterator, and much //! more. //! //! ## Rust's `for` loop //! //! The special syntax used by rust's `for` loop is based around the `Iterator` //! trait defined in this module. For loops can be viewed as a syntactical expansion //! into a `loop`, for example, the `for` loop in this example is essentially //! translated to the `loop` below. //! //! ``` //! let values = vec![1, 2, 3]; //! //! // "Syntactical sugar" taking advantage of an iterator //! for &x in values.iter() { //! println!("{}", x); //! } //! //! // Rough translation of the iteration without a `for` iterator. //! let mut it = values.iter(); //! loop { //! match it.next() { //! Some(&x) => { //! println!("{}", x); //! } //! None => { break } //! } //! } //! ``` //! //! This `for` loop syntax can be applied to any iterator over any type. #![stable(feature = "rust1", since = "1.0.0")] use self::MinMaxResult::*; use clone::Clone; use cmp; use cmp::Ord; use default::Default; use mem; use num::{ToPrimitive, Int}; use ops::{Add, Deref, FnMut}; use option::Option; use option::Option::{Some, None}; use std::marker::Sized; use usize; /// An interface for dealing with "external iterators". These types of iterators /// can be resumed at any time as all state is stored internally as opposed to /// being located on the call stack. /// /// The Iterator protocol states that an iterator yields a (potentially-empty, /// potentially-infinite) sequence of values, and returns `None` to signal that /// it's finished. The Iterator protocol does not define behavior after `None` /// is returned. A concrete Iterator implementation may choose to behave however /// it wishes, either by returning `None` infinitely, or by doing something /// else. #[lang="iterator"] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_on_unimplemented = "`{Self}` is not an iterator; maybe try calling `.iter()` or a similar \ method"] pub trait Iterator { #[stable(feature = "rust1", since = "1.0.0")] type Item; /// Advance the iterator and return the next value. Return `None` when the end is reached. #[stable(feature = "rust1", since = "1.0.0")] fn next(&mut self) -> Option; /// Returns a lower and upper bound on the remaining length of the iterator. /// /// An upper bound of `None` means either there is no known upper bound, or the upper bound /// does not fit within a `usize`. #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn size_hint(&self) -> (usize, Option) { (0, None) } } impl<'a, T> Iterator for &'a mut (Iterator + 'a) { type Item = T; fn next(&mut self) -> Option { (**self).next() } fn size_hint(&self) -> (usize, Option) { (**self).size_hint() } } /// Conversion from an `Iterator` #[stable(feature = "rust1", since = "1.0.0")] #[rustc_on_unimplemented="a collection of type `{Self}` cannot be \ built from an iterator over elements of type `{A}`"] pub trait FromIterator { /// Build a container with elements from an external iterator. fn from_iter>(iterator: T) -> Self; } /// Conversion into an `Iterator` pub trait IntoIterator { type Iter: Iterator; /// Consumes `Self` and returns an iterator over it fn into_iter(self) -> Self::Iter; } impl IntoIterator for I where I: Iterator { type Iter = I; fn into_iter(self) -> I { self } } /// A type growable from an `Iterator` implementation #[stable(feature = "rust1", since = "1.0.0")] pub trait Extend { /// Extend a container with the elements yielded by an arbitrary iterator #[stable(feature = "rust1", since = "1.0.0")] fn extend>(&mut self, iterator: T); } /// An extension trait providing numerous methods applicable to all iterators. #[stable(feature = "rust1", since = "1.0.0")] pub trait IteratorExt: Iterator + Sized { /// Counts the number of elements in this iterator. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// assert_eq!(a.iter().count(), 5); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn count(self) -> usize { self.fold(0, |cnt, _x| cnt + 1) } /// Loops through the entire iterator, returning the last element of the /// iterator. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// assert!(a.iter().last().unwrap() == &5); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn last(mut self) -> Option { let mut last = None; for x in self { last = Some(x); } last } /// Loops through `n` iterations, returning the `n`th element of the /// iterator. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let mut it = a.iter(); /// assert!(it.nth(2).unwrap() == &3); /// assert!(it.nth(2) == None); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn nth(&mut self, mut n: usize) -> Option { for x in self.by_ref() { if n == 0 { return Some(x) } n -= 1; } None } /// Chain this iterator with another, returning a new iterator that will /// finish iterating over the current iterator, and then iterate /// over the other specified iterator. /// /// # Examples /// /// ``` /// let a = [0]; /// let b = [1]; /// let mut it = a.iter().chain(b.iter()); /// assert_eq!(it.next().unwrap(), &0); /// assert_eq!(it.next().unwrap(), &1); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn chain(self, other: U) -> Chain where U: Iterator, { Chain{a: self, b: other, flag: false} } /// Creates an iterator that iterates over both this and the specified /// iterators simultaneously, yielding the two elements as pairs. When /// either iterator returns None, all further invocations of next() will /// return None. /// /// # Examples /// /// ``` /// let a = [0]; /// let b = [1]; /// let mut it = a.iter().zip(b.iter()); /// assert_eq!(it.next().unwrap(), (&0, &1)); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn zip(self, other: U) -> Zip where U: Iterator, { Zip{a: self, b: other} } /// Creates a new iterator that will apply the specified function to each /// element returned by the first, yielding the mapped element instead. /// /// # Examples /// /// ``` /// let a = [1, 2]; /// let mut it = a.iter().map(|&x| 2 * x); /// assert_eq!(it.next().unwrap(), 2); /// assert_eq!(it.next().unwrap(), 4); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn map(self, f: F) -> Map where F: FnMut(Self::Item) -> B, { Map{iter: self, f: f} } /// Creates an iterator that applies the predicate to each element returned /// by this iterator. The only elements that will be yieled are those that /// make the predicate evaluate to `true`. /// /// # Examples /// /// ``` /// let a = [1, 2]; /// let mut it = a.iter().filter(|&x| *x > 1); /// assert_eq!(it.next().unwrap(), &2); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn filter

(self, predicate: P) -> Filter where P: FnMut(&Self::Item) -> bool, { Filter{iter: self, predicate: predicate} } /// Creates an iterator that both filters and maps elements. /// If the specified function returns None, the element is skipped. /// Otherwise the option is unwrapped and the new value is yielded. /// /// # Examples /// /// ``` /// let a = [1, 2]; /// let mut it = a.iter().filter_map(|&x| if x > 1 {Some(2 * x)} else {None}); /// assert_eq!(it.next().unwrap(), 4); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn filter_map(self, f: F) -> FilterMap where F: FnMut(Self::Item) -> Option, { FilterMap { iter: self, f: f } } /// Creates an iterator that yields a pair of the value returned by this /// iterator plus the current index of iteration. /// /// # Examples /// /// ``` /// let a = [100, 200]; /// let mut it = a.iter().enumerate(); /// assert_eq!(it.next().unwrap(), (0, &100)); /// assert_eq!(it.next().unwrap(), (1, &200)); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn enumerate(self) -> Enumerate { Enumerate{iter: self, count: 0} } /// Creates an iterator that has a `.peek()` method /// that returns an optional reference to the next element. /// /// # Examples /// /// ``` /// let xs = [100, 200, 300]; /// let mut it = xs.iter().map(|x| *x).peekable(); /// assert_eq!(*it.peek().unwrap(), 100); /// assert_eq!(it.next().unwrap(), 100); /// assert_eq!(it.next().unwrap(), 200); /// assert_eq!(*it.peek().unwrap(), 300); /// assert_eq!(*it.peek().unwrap(), 300); /// assert_eq!(it.next().unwrap(), 300); /// assert!(it.peek().is_none()); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn peekable(self) -> Peekable { Peekable{iter: self, peeked: None} } /// Creates an iterator that invokes the predicate on elements /// until it returns false. Once the predicate returns false, that /// element and all further elements are yielded. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let mut it = a.iter().skip_while(|&a| *a < 3); /// assert_eq!(it.next().unwrap(), &3); /// assert_eq!(it.next().unwrap(), &4); /// assert_eq!(it.next().unwrap(), &5); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn skip_while

(self, predicate: P) -> SkipWhile where P: FnMut(&Self::Item) -> bool, { SkipWhile{iter: self, flag: false, predicate: predicate} } /// Creates an iterator that yields elements so long as the predicate /// returns true. After the predicate returns false for the first time, no /// further elements will be yielded. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let mut it = a.iter().take_while(|&a| *a < 3); /// assert_eq!(it.next().unwrap(), &1); /// assert_eq!(it.next().unwrap(), &2); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn take_while

(self, predicate: P) -> TakeWhile where P: FnMut(&Self::Item) -> bool, { TakeWhile{iter: self, flag: false, predicate: predicate} } /// Creates an iterator that skips the first `n` elements of this iterator, /// and then yields all further items. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let mut it = a.iter().skip(3); /// assert_eq!(it.next().unwrap(), &4); /// assert_eq!(it.next().unwrap(), &5); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn skip(self, n: usize) -> Skip { Skip{iter: self, n: n} } /// Creates an iterator that yields the first `n` elements of this /// iterator. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let mut it = a.iter().take(3); /// assert_eq!(it.next().unwrap(), &1); /// assert_eq!(it.next().unwrap(), &2); /// assert_eq!(it.next().unwrap(), &3); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn take(self, n: usize) -> Take { Take{iter: self, n: n} } /// Creates a new iterator that behaves in a similar fashion to fold. /// There is a state which is passed between each iteration and can be /// mutated as necessary. The yielded values from the closure are yielded /// from the Scan instance when not None. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let mut it = a.iter().scan(1, |fac, &x| { /// *fac = *fac * x; /// Some(*fac) /// }); /// assert_eq!(it.next().unwrap(), 1); /// assert_eq!(it.next().unwrap(), 2); /// assert_eq!(it.next().unwrap(), 6); /// assert_eq!(it.next().unwrap(), 24); /// assert_eq!(it.next().unwrap(), 120); /// assert!(it.next().is_none()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn scan( self, initial_state: St, f: F, ) -> Scan where F: FnMut(&mut St, Self::Item) -> Option, { Scan{iter: self, f: f, state: initial_state} } /// Creates an iterator that maps each element to an iterator, /// and yields the elements of the produced iterators. /// /// # Examples /// /// ``` /// let xs = [2, 3]; /// let ys = [0, 1, 0, 1, 2]; /// let it = xs.iter().flat_map(|&x| std::iter::count(0, 1).take(x)); /// // Check that `it` has the same elements as `ys` /// for (i, x) in it.enumerate() { /// assert_eq!(x, ys[i]); /// } /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn flat_map(self, f: F) -> FlatMap where U: Iterator, F: FnMut(Self::Item) -> U, { FlatMap{iter: self, f: f, frontiter: None, backiter: None } } /// Creates an iterator that yields `None` forever after the underlying /// iterator yields `None`. Random-access iterator behavior is not /// affected, only single and double-ended iterator behavior. /// /// # Examples /// /// ``` /// fn process>(it: U) -> isize { /// let mut it = it.fuse(); /// let mut sum = 0; /// for x in it.by_ref() { /// if x > 5 { /// break; /// } /// sum += x; /// } /// // did we exhaust the iterator? /// if it.next().is_none() { /// sum += 1000; /// } /// sum /// } /// let x = vec![1, 2, 3, 7, 8, 9]; /// assert_eq!(process(x.into_iter()), 6); /// let x = vec![1, 2, 3]; /// assert_eq!(process(x.into_iter()), 1006); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn fuse(self) -> Fuse { Fuse{iter: self, done: false} } /// Creates an iterator that calls a function with a reference to each /// element before yielding it. This is often useful for debugging an /// iterator pipeline. /// /// # Examples /// /// ``` /// use std::iter::AdditiveIterator; /// /// let a = [1, 4, 2, 3, 8, 9, 6]; /// let sum = a.iter() /// .map(|&x| x) /// .inspect(|&x| println!("filtering {}", x)) /// .filter(|&x| x % 2 == 0) /// .inspect(|&x| println!("{} made it through", x)) /// .sum(); /// println!("{}", sum); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn inspect(self, f: F) -> Inspect where F: FnMut(&Self::Item), { Inspect{iter: self, f: f} } /// Creates a wrapper around a mutable reference to the iterator. /// /// This is useful to allow applying iterator adaptors while still /// retaining ownership of the original iterator value. /// /// # Examples /// /// ``` /// let mut it = 0..10; /// // sum the first five values /// let partial_sum = it.by_ref().take(5).fold(0, |a, b| a + b); /// assert!(partial_sum == 10); /// assert!(it.next() == Some(5)); /// ``` #[stable(feature = "rust1", since = "1.0.0")] fn by_ref<'r>(&'r mut self) -> ByRef<'r, Self> { ByRef{iter: self} } /// Loops through the entire iterator, collecting all of the elements into /// a container implementing `FromIterator`. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let b: Vec<_> = a.iter().map(|&x| x).collect(); /// assert_eq!(a, b); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn collect>(self) -> B { FromIterator::from_iter(self) } /// Loops through the entire iterator, collecting all of the elements into /// one of two containers, depending on a predicate. The elements of the /// first container satisfy the predicate, while the elements of the second /// do not. /// /// ``` /// let vec = vec![1, 2, 3, 4]; /// let (even, odd): (Vec<_>, Vec<_>) = vec.into_iter().partition(|&n| n % 2 == 0); /// assert_eq!(even, vec![2, 4]); /// assert_eq!(odd, vec![1, 3]); /// ``` #[unstable(feature = "core", reason = "recently added as part of collections reform")] fn partition(mut self, mut f: F) -> (B, B) where B: Default + Extend, F: FnMut(&Self::Item) -> bool { let mut left: B = Default::default(); let mut right: B = Default::default(); for x in self { if f(&x) { left.extend(Some(x).into_iter()) } else { right.extend(Some(x).into_iter()) } } (left, right) } /// Performs a fold operation over the entire iterator, returning the /// eventual state at the end of the iteration. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// assert!(a.iter().fold(0, |a, &b| a + b) == 15); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn fold(mut self, init: B, mut f: F) -> B where F: FnMut(B, Self::Item) -> B, { let mut accum = init; for x in self { accum = f(accum, x); } accum } /// Tests whether the predicate holds true for all elements in the iterator. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// assert!(a.iter().all(|x| *x > 0)); /// assert!(!a.iter().all(|x| *x > 2)); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn all(mut self, mut f: F) -> bool where F: FnMut(Self::Item) -> bool { for x in self { if !f(x) { return false; } } true } /// Tests whether any element of an iterator satisfies the specified predicate. /// /// Does not consume the iterator past the first found element. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let mut it = a.iter(); /// assert!(it.any(|x| *x == 3)); /// assert_eq!(it.as_slice(), [4, 5]); /// /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn any(&mut self, mut f: F) -> bool where F: FnMut(Self::Item) -> bool { for x in self.by_ref() { if f(x) { return true; } } false } /// Returns the first element satisfying the specified predicate. /// /// Does not consume the iterator past the first found element. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let mut it = a.iter(); /// assert_eq!(it.find(|&x| *x == 3).unwrap(), &3); /// assert_eq!(it.as_slice(), [4, 5]); #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn find

(&mut self, mut predicate: P) -> Option where P: FnMut(&Self::Item) -> bool, { for x in self.by_ref() { if predicate(&x) { return Some(x) } } None } /// Return the index of the first element satisfying the specified predicate /// /// Does not consume the iterator past the first found element. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// let mut it = a.iter(); /// assert_eq!(it.position(|x| *x == 3).unwrap(), 2); /// assert_eq!(it.as_slice(), [4, 5]); #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn position

(&mut self, mut predicate: P) -> Option where P: FnMut(Self::Item) -> bool, { let mut i = 0; for x in self.by_ref() { if predicate(x) { return Some(i); } i += 1; } None } /// Return the index of the last element satisfying the specified predicate /// /// If no element matches, None is returned. /// /// Does not consume the iterator *before* the first found element. /// /// # Examples /// /// ``` /// let a = [1, 2, 2, 4, 5]; /// let mut it = a.iter(); /// assert_eq!(it.rposition(|x| *x == 2).unwrap(), 2); /// assert_eq!(it.as_slice(), [1, 2]); #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn rposition

(&mut self, mut predicate: P) -> Option where P: FnMut(Self::Item) -> bool, Self: ExactSizeIterator + DoubleEndedIterator { let len = self.len(); for i in (0..len).rev() { if predicate(self.next_back().expect("rposition: incorrect ExactSizeIterator")) { return Some(i); } } None } /// Consumes the entire iterator to return the maximum element. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// assert!(a.iter().max().unwrap() == &5); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn max(self) -> Option where Self::Item: Ord { self.fold(None, |max, x| { match max { None => Some(x), Some(y) => Some(cmp::max(x, y)) } }) } /// Consumes the entire iterator to return the minimum element. /// /// # Examples /// /// ``` /// let a = [1, 2, 3, 4, 5]; /// assert!(a.iter().min().unwrap() == &1); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn min(self) -> Option where Self::Item: Ord { self.fold(None, |min, x| { match min { None => Some(x), Some(y) => Some(cmp::min(x, y)) } }) } /// `min_max` finds the minimum and maximum elements in the iterator. /// /// The return type `MinMaxResult` is an enum of three variants: /// /// - `NoElements` if the iterator is empty. /// - `OneElement(x)` if the iterator has exactly one element. /// - `MinMax(x, y)` is returned otherwise, where `x <= y`. Two /// values are equal if and only if there is more than one /// element in the iterator and all elements are equal. /// /// On an iterator of length `n`, `min_max` does `1.5 * n` comparisons, /// and so is faster than calling `min` and `max` separately which does `2 * n` comparisons. /// /// # Examples /// /// ``` /// use std::iter::MinMaxResult::{NoElements, OneElement, MinMax}; /// /// let a: [isize; 0] = []; /// assert_eq!(a.iter().min_max(), NoElements); /// /// let a = [1]; /// assert!(a.iter().min_max() == OneElement(&1)); /// /// let a = [1, 2, 3, 4, 5]; /// assert!(a.iter().min_max() == MinMax(&1, &5)); /// /// let a = [1, 1, 1, 1]; /// assert!(a.iter().min_max() == MinMax(&1, &1)); /// ``` #[unstable(feature = "core", reason = "return type may change")] fn min_max(mut self) -> MinMaxResult where Self::Item: Ord { let (mut min, mut max) = match self.next() { None => return NoElements, Some(x) => { match self.next() { None => return OneElement(x), Some(y) => if x < y {(x, y)} else {(y,x)} } } }; loop { // `first` and `second` are the two next elements we want to look at. // We first compare `first` and `second` (#1). The smaller one is then compared to // current minimum (#2). The larger one is compared to current maximum (#3). This // way we do 3 comparisons for 2 elements. let first = match self.next() { None => break, Some(x) => x }; let second = match self.next() { None => { if first < min { min = first; } else if first > max { max = first; } break; } Some(x) => x }; if first < second { if first < min {min = first;} if max < second {max = second;} } else { if second < min {min = second;} if max < first {max = first;} } } MinMax(min, max) } /// Return the element that gives the maximum value from the /// specified function. /// /// # Examples /// /// ``` /// use core::num::SignedInt; /// /// let a = [-3, 0, 1, 5, -10]; /// assert_eq!(*a.iter().max_by(|x| x.abs()).unwrap(), -10); /// ``` #[inline] #[unstable(feature = "core", reason = "may want to produce an Ordering directly; see #15311")] fn max_by(self, mut f: F) -> Option where F: FnMut(&Self::Item) -> B, { self.fold(None, |max: Option<(Self::Item, B)>, x| { let x_val = f(&x); match max { None => Some((x, x_val)), Some((y, y_val)) => if x_val > y_val { Some((x, x_val)) } else { Some((y, y_val)) } } }).map(|(x, _)| x) } /// Return the element that gives the minimum value from the /// specified function. /// /// # Examples /// /// ``` /// use core::num::SignedInt; /// /// let a = [-3, 0, 1, 5, -10]; /// assert_eq!(*a.iter().min_by(|x| x.abs()).unwrap(), 0); /// ``` #[inline] #[unstable(feature = "core", reason = "may want to produce an Ordering directly; see #15311")] fn min_by(self, mut f: F) -> Option where F: FnMut(&Self::Item) -> B, { self.fold(None, |min: Option<(Self::Item, B)>, x| { let x_val = f(&x); match min { None => Some((x, x_val)), Some((y, y_val)) => if x_val < y_val { Some((x, x_val)) } else { Some((y, y_val)) } } }).map(|(x, _)| x) } /// Change the direction of the iterator /// /// The flipped iterator swaps the ends on an iterator that can already /// be iterated from the front and from the back. /// /// /// If the iterator also implements RandomAccessIterator, the flipped /// iterator is also random access, with the indices starting at the back /// of the original iterator. /// /// Note: Random access with flipped indices still only applies to the first /// `std::usize::MAX` elements of the original iterator. #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn rev(self) -> Rev { Rev{iter: self} } /// Converts an iterator of pairs into a pair of containers. /// /// Loops through the entire iterator, collecting the first component of /// each item into one new container, and the second component into another. /// /// # Examples /// /// ``` /// let a = [(1, 2), (3, 4)]; /// let (left, right): (Vec<_>, Vec<_>) = a.iter().map(|&x| x).unzip(); /// assert_eq!([1, 3], left); /// assert_eq!([2, 4], right); /// ``` #[unstable(feature = "core", reason = "recent addition")] fn unzip(mut self) -> (FromA, FromB) where FromA: Default + Extend, FromB: Default + Extend, Self: Iterator, { struct SizeHint(usize, Option); impl Iterator for SizeHint { type Item = A; fn next(&mut self) -> Option { None } fn size_hint(&self) -> (usize, Option) { (self.0, self.1) } } let (lo, hi) = self.size_hint(); let mut ts: FromA = Default::default(); let mut us: FromB = Default::default(); ts.extend(SizeHint(lo, hi)); us.extend(SizeHint(lo, hi)); for (t, u) in self { ts.extend(Some(t).into_iter()); us.extend(Some(u).into_iter()); } (ts, us) } /// Creates an iterator that clones the elements it yields. Useful for converting an /// Iterator<&T> to an Iterator. #[unstable(feature = "core", reason = "recent addition")] fn cloned(self) -> Cloned where Self: Iterator, D: Deref, T: Clone, { Cloned { it: self } } /// Repeats an iterator endlessly /// /// # Examples /// /// ``` /// let a = [1, 2]; /// let mut it = a.iter().cycle(); /// assert_eq!(it.next().unwrap(), &1); /// assert_eq!(it.next().unwrap(), &2); /// assert_eq!(it.next().unwrap(), &1); /// ``` #[stable(feature = "rust1", since = "1.0.0")] #[inline] fn cycle(self) -> Cycle where Self: Clone { Cycle{orig: self.clone(), iter: self} } /// Use an iterator to reverse a container in place. #[unstable(feature = "core", reason = "uncertain about placement or widespread use")] fn reverse_in_place<'a, T: 'a>(&mut self) where Self: Iterator + DoubleEndedIterator { loop { match (self.next(), self.next_back()) { (Some(x), Some(y)) => mem::swap(x, y), _ => break } } } } #[stable(feature = "rust1", since = "1.0.0")] impl IteratorExt for I where I: Iterator {} /// A range iterator able to yield elements from both ends /// /// A `DoubleEndedIterator` can be thought of as a deque in that `next()` and `next_back()` exhaust /// elements from the *same* range, and do not work independently of each other. #[stable(feature = "rust1", since = "1.0.0")] pub trait DoubleEndedIterator: Iterator { /// Yield an element from the end of the range, returning `None` if the range is empty. #[stable(feature = "rust1", since = "1.0.0")] fn next_back(&mut self) -> Option; } /// An object implementing random access indexing by `usize` /// /// A `RandomAccessIterator` should be either infinite or a `DoubleEndedIterator`. /// Calling `next()` or `next_back()` on a `RandomAccessIterator` /// reduces the indexable range accordingly. That is, `it.idx(1)` will become `it.idx(0)` /// after `it.next()` is called. #[unstable(feature = "core", reason = "not widely used, may be better decomposed into Index and ExactSizeIterator")] pub trait RandomAccessIterator: Iterator { /// Return the number of indexable elements. At most `std::usize::MAX` /// elements are indexable, even if the iterator represents a longer range. fn indexable(&self) -> usize; /// Return an element at an index, or `None` if the index is out of bounds fn idx(&mut self, index: usize) -> Option; } /// An iterator that knows its exact length /// /// This trait is a helper for iterators like the vector iterator, so that /// it can support double-ended enumeration. /// /// `Iterator::size_hint` *must* return the exact size of the iterator. /// Note that the size must fit in `usize`. #[stable(feature = "rust1", since = "1.0.0")] pub trait ExactSizeIterator: Iterator { #[inline] /// Return the exact length of the iterator. fn len(&self) -> usize { let (lower, upper) = self.size_hint(); // Note: This assertion is overly defensive, but it checks the invariant // guaranteed by the trait. If this trait were rust-internal, // we could use debug_assert!; assert_eq! will check all Rust user // implementations too. assert_eq!(upper, Some(lower)); lower } } // All adaptors that preserve the size of the wrapped iterator are fine // Adaptors that may overflow in `size_hint` are not, i.e. `Chain`. #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Enumerate where I: ExactSizeIterator {} #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Inspect where I: ExactSizeIterator, F: FnMut(&A), {} #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Rev where I: ExactSizeIterator + DoubleEndedIterator {} #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Map where I: ExactSizeIterator, F: FnMut(A) -> B, {} #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Zip where A: ExactSizeIterator, B: ExactSizeIterator {} /// An double-ended iterator with the direction inverted #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Rev { iter: T } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Rev where I: DoubleEndedIterator { type Item = ::Item; #[inline] fn next(&mut self) -> Option<::Item> { self.iter.next_back() } #[inline] fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Rev where I: DoubleEndedIterator { #[inline] fn next_back(&mut self) -> Option<::Item> { self.iter.next() } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Rev where I: DoubleEndedIterator + RandomAccessIterator { #[inline] fn indexable(&self) -> usize { self.iter.indexable() } #[inline] fn idx(&mut self, index: usize) -> Option<::Item> { let amt = self.indexable(); self.iter.idx(amt - index - 1) } } /// A mutable reference to an iterator #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct ByRef<'a, I:'a> { iter: &'a mut I, } #[stable(feature = "rust1", since = "1.0.0")] impl<'a, I> Iterator for ByRef<'a, I> where I: 'a + Iterator { type Item = ::Item; #[inline] fn next(&mut self) -> Option<::Item> { self.iter.next() } #[inline] fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } } #[stable(feature = "rust1", since = "1.0.0")] impl<'a, I> DoubleEndedIterator for ByRef<'a, I> where I: 'a + DoubleEndedIterator { #[inline] fn next_back(&mut self) -> Option<::Item> { self.iter.next_back() } } #[stable(feature = "rust1", since = "1.0.0")] impl<'a, I> ExactSizeIterator for ByRef<'a, I> where I: 'a + ExactSizeIterator {} /// A trait for iterators over elements which can be added together #[unstable(feature = "core", reason = "needs to be re-evaluated as part of numerics reform")] pub trait AdditiveIterator { /// Iterates over the entire iterator, summing up all the elements /// /// # Examples /// /// ``` /// use std::iter::AdditiveIterator; /// /// let a = [1i32, 2, 3, 4, 5]; /// let mut it = a.iter().map(|&x| x); /// assert!(it.sum() == 15); /// ``` fn sum(self) -> A; } macro_rules! impl_additive { ($A:ty, $init:expr) => { #[unstable(feature = "core", reason = "trait is experimental")] impl> AdditiveIterator<$A> for T { #[inline] fn sum(self) -> $A { self.fold($init, |acc, x| acc + x) } } }; } impl_additive! { i8, 0 } impl_additive! { i16, 0 } impl_additive! { i32, 0 } impl_additive! { i64, 0 } impl_additive! { isize, 0 } impl_additive! { u8, 0 } impl_additive! { u16, 0 } impl_additive! { u32, 0 } impl_additive! { u64, 0 } impl_additive! { usize, 0 } impl_additive! { f32, 0.0 } impl_additive! { f64, 0.0 } /// A trait for iterators over elements which can be multiplied together. #[unstable(feature = "core", reason = "needs to be re-evaluated as part of numerics reform")] pub trait MultiplicativeIterator { /// Iterates over the entire iterator, multiplying all the elements /// /// # Examples /// /// ``` /// use std::iter::{count, MultiplicativeIterator}; /// /// fn factorial(n: usize) -> usize { /// count(1, 1).take_while(|&i| i <= n).product() /// } /// assert!(factorial(0) == 1); /// assert!(factorial(1) == 1); /// assert!(factorial(5) == 120); /// ``` fn product(self) -> A; } macro_rules! impl_multiplicative { ($A:ty, $init:expr) => { #[unstable(feature = "core", reason = "trait is experimental")] impl> MultiplicativeIterator<$A> for T { #[inline] fn product(self) -> $A { self.fold($init, |acc, x| acc * x) } } }; } impl_multiplicative! { i8, 1 } impl_multiplicative! { i16, 1 } impl_multiplicative! { i32, 1 } impl_multiplicative! { i64, 1 } impl_multiplicative! { isize, 1 } impl_multiplicative! { u8, 1 } impl_multiplicative! { u16, 1 } impl_multiplicative! { u32, 1 } impl_multiplicative! { u64, 1 } impl_multiplicative! { usize, 1 } impl_multiplicative! { f32, 1.0 } impl_multiplicative! { f64, 1.0 } /// `MinMaxResult` is an enum returned by `min_max`. See `IteratorOrdExt::min_max` for more detail. #[derive(Clone, PartialEq, Debug)] #[unstable(feature = "core", reason = "unclear whether such a fine-grained result is widely useful")] pub enum MinMaxResult { /// Empty iterator NoElements, /// Iterator with one element, so the minimum and maximum are the same OneElement(T), /// More than one element in the iterator, the first element is not larger than the second MinMax(T, T) } impl MinMaxResult { /// `into_option` creates an `Option` of type `(T,T)`. The returned `Option` has variant /// `None` if and only if the `MinMaxResult` has variant `NoElements`. Otherwise variant /// `Some(x,y)` is returned where `x <= y`. If `MinMaxResult` has variant `OneElement(x)`, /// performing this operation will make one clone of `x`. /// /// # Examples /// /// ``` /// use std::iter::MinMaxResult::{self, NoElements, OneElement, MinMax}; /// /// let r: MinMaxResult = NoElements; /// assert_eq!(r.into_option(), None); /// /// let r = OneElement(1); /// assert_eq!(r.into_option(), Some((1, 1))); /// /// let r = MinMax(1, 2); /// assert_eq!(r.into_option(), Some((1, 2))); /// ``` #[unstable(feature = "core", reason = "type is unstable")] pub fn into_option(self) -> Option<(T,T)> { match self { NoElements => None, OneElement(x) => Some((x.clone(), x)), MinMax(x, y) => Some((x, y)) } } } /// An iterator that clones the elements of an underlying iterator #[unstable(feature = "core", reason = "recent addition")] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[derive(Clone)] pub struct Cloned { it: I, } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Cloned where T: Clone, D: Deref, I: Iterator, { type Item = T; fn next(&mut self) -> Option { self.it.next().cloned() } fn size_hint(&self) -> (usize, Option) { self.it.size_hint() } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Cloned where T: Clone, D: Deref, I: DoubleEndedIterator, { fn next_back(&mut self) -> Option { self.it.next_back().cloned() } } #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Cloned where T: Clone, D: Deref, I: ExactSizeIterator, {} /// An iterator that repeats endlessly #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Cycle { orig: I, iter: I, } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Cycle where I: Clone + Iterator { type Item = ::Item; #[inline] fn next(&mut self) -> Option<::Item> { match self.iter.next() { None => { self.iter = self.orig.clone(); self.iter.next() } y => y } } #[inline] fn size_hint(&self) -> (usize, Option) { // the cycle iterator is either empty or infinite match self.orig.size_hint() { sz @ (0, Some(0)) => sz, (0, _) => (0, None), _ => (usize::MAX, None) } } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Cycle where I: Clone + RandomAccessIterator, { #[inline] fn indexable(&self) -> usize { if self.orig.indexable() > 0 { usize::MAX } else { 0 } } #[inline] fn idx(&mut self, index: usize) -> Option<::Item> { let liter = self.iter.indexable(); let lorig = self.orig.indexable(); if lorig == 0 { None } else if index < liter { self.iter.idx(index) } else { self.orig.idx((index - liter) % lorig) } } } /// An iterator that strings two iterators together #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Chain { a: A, b: B, flag: bool, } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Chain where A: Iterator, B: Iterator { type Item = T; #[inline] fn next(&mut self) -> Option { if self.flag { self.b.next() } else { match self.a.next() { Some(x) => return Some(x), _ => () } self.flag = true; self.b.next() } } #[inline] fn size_hint(&self) -> (usize, Option) { let (a_lower, a_upper) = self.a.size_hint(); let (b_lower, b_upper) = self.b.size_hint(); let lower = a_lower.saturating_add(b_lower); let upper = match (a_upper, b_upper) { (Some(x), Some(y)) => x.checked_add(y), _ => None }; (lower, upper) } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Chain where A: DoubleEndedIterator, B: DoubleEndedIterator, { #[inline] fn next_back(&mut self) -> Option { match self.b.next_back() { Some(x) => Some(x), None => self.a.next_back() } } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Chain where A: RandomAccessIterator, B: RandomAccessIterator, { #[inline] fn indexable(&self) -> usize { let (a, b) = (self.a.indexable(), self.b.indexable()); a.saturating_add(b) } #[inline] fn idx(&mut self, index: usize) -> Option { let len = self.a.indexable(); if index < len { self.a.idx(index) } else { self.b.idx(index - len) } } } /// An iterator that iterates two other iterators simultaneously #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Zip { a: A, b: B } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Zip where A: Iterator, B: Iterator, { type Item = (T, U); #[inline] fn next(&mut self) -> Option<(T, U)> { match self.a.next() { None => None, Some(x) => match self.b.next() { None => None, Some(y) => Some((x, y)) } } } #[inline] fn size_hint(&self) -> (usize, Option) { let (a_lower, a_upper) = self.a.size_hint(); let (b_lower, b_upper) = self.b.size_hint(); let lower = cmp::min(a_lower, b_lower); let upper = match (a_upper, b_upper) { (Some(x), Some(y)) => Some(cmp::min(x,y)), (Some(x), None) => Some(x), (None, Some(y)) => Some(y), (None, None) => None }; (lower, upper) } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Zip where A: DoubleEndedIterator + ExactSizeIterator, B: DoubleEndedIterator + ExactSizeIterator, { #[inline] fn next_back(&mut self) -> Option<(T, U)> { let a_sz = self.a.len(); let b_sz = self.b.len(); if a_sz != b_sz { // Adjust a, b to equal length if a_sz > b_sz { for _ in 0..a_sz - b_sz { self.a.next_back(); } } else { for _ in 0..b_sz - a_sz { self.b.next_back(); } } } match (self.a.next_back(), self.b.next_back()) { (Some(x), Some(y)) => Some((x, y)), (None, None) => None, _ => unreachable!(), } } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Zip where A: RandomAccessIterator, B: RandomAccessIterator, { #[inline] fn indexable(&self) -> usize { cmp::min(self.a.indexable(), self.b.indexable()) } #[inline] fn idx(&mut self, index: usize) -> Option<(T, U)> { match self.a.idx(index) { None => None, Some(x) => match self.b.idx(index) { None => None, Some(y) => Some((x, y)) } } } } /// An iterator that maps the values of `iter` with `f` #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Map, F: FnMut(A) -> B> { iter: I, f: F, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Map where I: Clone + Iterator, F: Clone + FnMut(A) -> B, { fn clone(&self) -> Map { Map { iter: self.iter.clone(), f: self.f.clone(), } } } impl Map where I: Iterator, F: FnMut(A) -> B { #[inline] fn do_map(&mut self, elt: Option) -> Option { match elt { Some(a) => Some((self.f)(a)), _ => None } } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Map where I: Iterator, F: FnMut(A) -> B { type Item = B; #[inline] fn next(&mut self) -> Option { let next = self.iter.next(); self.do_map(next) } #[inline] fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Map where I: DoubleEndedIterator, F: FnMut(A) -> B, { #[inline] fn next_back(&mut self) -> Option { let next = self.iter.next_back(); self.do_map(next) } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Map where I: RandomAccessIterator, F: FnMut(A) -> B, { #[inline] fn indexable(&self) -> usize { self.iter.indexable() } #[inline] fn idx(&mut self, index: usize) -> Option { let elt = self.iter.idx(index); self.do_map(elt) } } /// An iterator that filters the elements of `iter` with `predicate` #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Filter where I: Iterator, P: FnMut(&A) -> bool { iter: I, predicate: P, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Filter where I: Clone + Iterator, P: Clone + FnMut(&A) -> bool, { fn clone(&self) -> Filter { Filter { iter: self.iter.clone(), predicate: self.predicate.clone(), } } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Filter where I: Iterator, P: FnMut(&A) -> bool { type Item = A; #[inline] fn next(&mut self) -> Option { for x in self.iter.by_ref() { if (self.predicate)(&x) { return Some(x); } else { continue } } None } #[inline] fn size_hint(&self) -> (usize, Option) { let (_, upper) = self.iter.size_hint(); (0, upper) // can't know a lower bound, due to the predicate } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Filter where I: DoubleEndedIterator, P: FnMut(&A) -> bool, { #[inline] fn next_back(&mut self) -> Option { for x in self.iter.by_ref().rev() { if (self.predicate)(&x) { return Some(x); } } None } } /// An iterator that uses `f` to both filter and map elements from `iter` #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct FilterMap where I: Iterator, F: FnMut(A) -> Option { iter: I, f: F, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for FilterMap where I: Clone + Iterator, F: Clone + FnMut(A) -> Option, { fn clone(&self) -> FilterMap { FilterMap { iter: self.iter.clone(), f: self.f.clone(), } } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for FilterMap where I: Iterator, F: FnMut(A) -> Option, { type Item = B; #[inline] fn next(&mut self) -> Option { for x in self.iter.by_ref() { match (self.f)(x) { Some(y) => return Some(y), None => () } } None } #[inline] fn size_hint(&self) -> (usize, Option) { let (_, upper) = self.iter.size_hint(); (0, upper) // can't know a lower bound, due to the predicate } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for FilterMap where I: DoubleEndedIterator, F: FnMut(A) -> Option, { #[inline] fn next_back(&mut self) -> Option { for x in self.iter.by_ref().rev() { match (self.f)(x) { Some(y) => return Some(y), None => () } } None } } /// An iterator that yields the current count and the element during iteration #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Enumerate { iter: I, count: usize } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Enumerate where I: Iterator { type Item = (usize, ::Item); #[inline] fn next(&mut self) -> Option<(usize, ::Item)> { match self.iter.next() { Some(a) => { let ret = Some((self.count, a)); self.count += 1; ret } _ => None } } #[inline] fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Enumerate where I: ExactSizeIterator + DoubleEndedIterator { #[inline] fn next_back(&mut self) -> Option<(usize, ::Item)> { match self.iter.next_back() { Some(a) => { let len = self.iter.len(); Some((self.count + len, a)) } _ => None } } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Enumerate where I: RandomAccessIterator { #[inline] fn indexable(&self) -> usize { self.iter.indexable() } #[inline] fn idx(&mut self, index: usize) -> Option<(usize, ::Item)> { match self.iter.idx(index) { Some(a) => Some((self.count + index, a)), _ => None, } } } /// An iterator with a `peek()` that returns an optional reference to the next element. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Peekable where I: Iterator { iter: I, peeked: Option, } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Peekable where I: Iterator { type Item = T; #[inline] fn next(&mut self) -> Option { if self.peeked.is_some() { self.peeked.take() } else { self.iter.next() } } #[inline] fn size_hint(&self) -> (usize, Option) { let (lo, hi) = self.iter.size_hint(); if self.peeked.is_some() { let lo = lo.saturating_add(1); let hi = match hi { Some(x) => x.checked_add(1), None => None }; (lo, hi) } else { (lo, hi) } } } #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Peekable where I: ExactSizeIterator {} #[stable(feature = "rust1", since = "1.0.0")] impl Peekable where I: Iterator { /// Return a reference to the next element of the iterator with out advancing it, /// or None if the iterator is exhausted. #[inline] pub fn peek(&mut self) -> Option<&T> { if self.peeked.is_none() { self.peeked = self.iter.next(); } match self.peeked { Some(ref value) => Some(value), None => None, } } /// Check whether peekable iterator is empty or not. #[inline] pub fn is_empty(&mut self) -> bool { self.peek().is_none() } } /// An iterator that rejects elements while `predicate` is true #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct SkipWhile where I: Iterator, P: FnMut(&A) -> bool { iter: I, flag: bool, predicate: P, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for SkipWhile where I: Clone + Iterator, P: Clone + FnMut(&A) -> bool, { fn clone(&self) -> SkipWhile { SkipWhile { iter: self.iter.clone(), flag: self.flag, predicate: self.predicate.clone(), } } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for SkipWhile where I: Iterator, P: FnMut(&A) -> bool { type Item = A; #[inline] fn next(&mut self) -> Option { for x in self.iter.by_ref() { if self.flag || !(self.predicate)(&x) { self.flag = true; return Some(x); } } None } #[inline] fn size_hint(&self) -> (usize, Option) { let (_, upper) = self.iter.size_hint(); (0, upper) // can't know a lower bound, due to the predicate } } /// An iterator that only accepts elements while `predicate` is true #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct TakeWhile where I: Iterator, P: FnMut(&A) -> bool { iter: I, flag: bool, predicate: P, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for TakeWhile where I: Clone + Iterator, P: Clone + FnMut(&A) -> bool, { fn clone(&self) -> TakeWhile { TakeWhile { iter: self.iter.clone(), flag: self.flag, predicate: self.predicate.clone(), } } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for TakeWhile where I: Iterator, P: FnMut(&A) -> bool { type Item = A; #[inline] fn next(&mut self) -> Option { if self.flag { None } else { match self.iter.next() { Some(x) => { if (self.predicate)(&x) { Some(x) } else { self.flag = true; None } } None => None } } } #[inline] fn size_hint(&self) -> (usize, Option) { let (_, upper) = self.iter.size_hint(); (0, upper) // can't know a lower bound, due to the predicate } } /// An iterator that skips over `n` elements of `iter`. #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Skip { iter: I, n: usize } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Skip where I: Iterator { type Item = ::Item; #[inline] fn next(&mut self) -> Option<::Item> { let mut next = self.iter.next(); if self.n == 0 { next } else { let mut n = self.n; while n > 0 { n -= 1; match next { Some(_) => { next = self.iter.next(); continue } None => { self.n = 0; return None } } } self.n = 0; next } } #[inline] fn size_hint(&self) -> (usize, Option) { let (lower, upper) = self.iter.size_hint(); let lower = lower.saturating_sub(self.n); let upper = match upper { Some(x) => Some(x.saturating_sub(self.n)), None => None }; (lower, upper) } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Skip where I: RandomAccessIterator{ #[inline] fn indexable(&self) -> usize { self.iter.indexable().saturating_sub(self.n) } #[inline] fn idx(&mut self, index: usize) -> Option<::Item> { if index >= self.indexable() { None } else { self.iter.idx(index + self.n) } } } #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Skip where I: ExactSizeIterator {} /// An iterator that only iterates over the first `n` iterations of `iter`. #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Take { iter: I, n: usize } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Take where I: Iterator{ type Item = ::Item; #[inline] fn next(&mut self) -> Option<::Item> { if self.n != 0 { self.n -= 1; self.iter.next() } else { None } } #[inline] fn size_hint(&self) -> (usize, Option) { let (lower, upper) = self.iter.size_hint(); let lower = cmp::min(lower, self.n); let upper = match upper { Some(x) if x < self.n => Some(x), _ => Some(self.n) }; (lower, upper) } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Take where I: RandomAccessIterator{ #[inline] fn indexable(&self) -> usize { cmp::min(self.iter.indexable(), self.n) } #[inline] fn idx(&mut self, index: usize) -> Option<::Item> { if index >= self.n { None } else { self.iter.idx(index) } } } #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Take where I: ExactSizeIterator {} /// An iterator to maintain state while iterating another iterator #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Scan where I: Iterator, F: FnMut(&mut St, A) -> Option { iter: I, f: F, /// The current internal state to be passed to the closure next. pub state: St, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Scan where I: Clone + Iterator, St: Clone, F: Clone + FnMut(&mut St, A) -> Option, { fn clone(&self) -> Scan { Scan { iter: self.iter.clone(), f: self.f.clone(), state: self.state.clone(), } } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Scan where I: Iterator, F: FnMut(&mut St, A) -> Option, { type Item = B; #[inline] fn next(&mut self) -> Option { self.iter.next().and_then(|a| (self.f)(&mut self.state, a)) } #[inline] fn size_hint(&self) -> (usize, Option) { let (_, upper) = self.iter.size_hint(); (0, upper) // can't know a lower bound, due to the scan function } } /// An iterator that maps each element to an iterator, /// and yields the elements of the produced iterators /// #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct FlatMap where I: Iterator, U: Iterator, F: FnMut(A) -> U, { iter: I, f: F, frontiter: Option, backiter: Option, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for FlatMap where I: Clone + Iterator, U: Clone + Iterator, F: Clone + FnMut(A) -> U, { fn clone(&self) -> FlatMap { FlatMap { iter: self.iter.clone(), f: self.f.clone(), frontiter: self.frontiter.clone(), backiter: self.backiter.clone(), } } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for FlatMap where I: Iterator, U: Iterator, F: FnMut(A) -> U, { type Item = B; #[inline] fn next(&mut self) -> Option { loop { for inner in self.frontiter.iter_mut() { for x in inner.by_ref() { return Some(x) } } match self.iter.next().map(|x| (self.f)(x)) { None => return self.backiter.as_mut().and_then(|it| it.next()), next => self.frontiter = next, } } } #[inline] fn size_hint(&self) -> (usize, Option) { let (flo, fhi) = self.frontiter.as_ref().map_or((0, Some(0)), |it| it.size_hint()); let (blo, bhi) = self.backiter.as_ref().map_or((0, Some(0)), |it| it.size_hint()); let lo = flo.saturating_add(blo); match (self.iter.size_hint(), fhi, bhi) { ((0, Some(0)), Some(a), Some(b)) => (lo, a.checked_add(b)), _ => (lo, None) } } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for FlatMap where I: DoubleEndedIterator, U: DoubleEndedIterator, F: FnMut(A) -> U, { #[inline] fn next_back(&mut self) -> Option { loop { for inner in self.backiter.iter_mut() { match inner.next_back() { None => (), y => return y } } match self.iter.next_back().map(|x| (self.f)(x)) { None => return self.frontiter.as_mut().and_then(|it| it.next_back()), next => self.backiter = next, } } } } /// An iterator that yields `None` forever after the underlying iterator /// yields `None` once. #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Fuse { iter: I, done: bool } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Fuse where I: Iterator { type Item = ::Item; #[inline] fn next(&mut self) -> Option<::Item> { if self.done { None } else { match self.iter.next() { None => { self.done = true; None } x => x } } } #[inline] fn size_hint(&self) -> (usize, Option) { if self.done { (0, Some(0)) } else { self.iter.size_hint() } } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Fuse where I: DoubleEndedIterator { #[inline] fn next_back(&mut self) -> Option<::Item> { if self.done { None } else { match self.iter.next_back() { None => { self.done = true; None } x => x } } } } // Allow RandomAccessIterators to be fused without affecting random-access behavior #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Fuse where I: RandomAccessIterator { #[inline] fn indexable(&self) -> usize { self.iter.indexable() } #[inline] fn idx(&mut self, index: usize) -> Option<::Item> { self.iter.idx(index) } } #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Fuse where I: ExactSizeIterator {} impl Fuse { /// Resets the fuse such that the next call to .next() or .next_back() will /// call the underlying iterator again even if it previously returned None. #[inline] #[unstable(feature = "core", reason = "seems marginal")] pub fn reset_fuse(&mut self) { self.done = false } } /// An iterator that calls a function with a reference to each /// element before yielding it. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Inspect where I: Iterator, F: FnMut(&A) { iter: I, f: F, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Inspect where I: Clone + Iterator, F: Clone + FnMut(&A), { fn clone(&self) -> Inspect { Inspect { iter: self.iter.clone(), f: self.f.clone(), } } } impl Inspect where I: Iterator, F: FnMut(&A) { #[inline] fn do_inspect(&mut self, elt: Option) -> Option { match elt { Some(ref a) => (self.f)(a), None => () } elt } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Inspect where I: Iterator, F: FnMut(&A) { type Item = A; #[inline] fn next(&mut self) -> Option { let next = self.iter.next(); self.do_inspect(next) } #[inline] fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Inspect where I: DoubleEndedIterator, F: FnMut(&A), { #[inline] fn next_back(&mut self) -> Option { let next = self.iter.next_back(); self.do_inspect(next) } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Inspect where I: RandomAccessIterator, F: FnMut(&A), { #[inline] fn indexable(&self) -> usize { self.iter.indexable() } #[inline] fn idx(&mut self, index: usize) -> Option { let element = self.iter.idx(index); self.do_inspect(element) } } /// An iterator that passes mutable state to a closure and yields the result. /// /// # Example: The Fibonacci Sequence /// /// An iterator that yields sequential Fibonacci numbers, and stops on overflow. /// /// ``` /// use std::iter::Unfold; /// use std::num::Int; // For `.checked_add()` /// /// // This iterator will yield up to the last Fibonacci number before the max value of `u32`. /// // You can simply change `u32` to `u64` in this line if you want higher values than that. /// let mut fibonacci = Unfold::new((Some(0u32), Some(1u32)), |&mut (ref mut x2, ref mut x1)| { /// // Attempt to get the next Fibonacci number /// // `x1` will be `None` if previously overflowed. /// let next = match (*x2, *x1) { /// (Some(x2), Some(x1)) => x2.checked_add(x1), /// _ => None, /// }; /// /// // Shift left: ret <- x2 <- x1 <- next /// let ret = *x2; /// *x2 = *x1; /// *x1 = next; /// /// ret /// }); /// /// for i in fibonacci { /// println!("{}", i); /// } /// ``` #[unstable(feature = "core")] pub struct Unfold where F: FnMut(&mut St) -> Option { f: F, /// Internal state that will be passed to the closure on the next iteration pub state: St, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Unfold where F: Clone + FnMut(&mut St) -> Option, St: Clone, { fn clone(&self) -> Unfold { Unfold { f: self.f.clone(), state: self.state.clone(), } } } #[unstable(feature = "core")] impl Unfold where F: FnMut(&mut St) -> Option { /// Creates a new iterator with the specified closure as the "iterator /// function" and an initial state to eventually pass to the closure #[inline] pub fn new(initial_state: St, f: F) -> Unfold { Unfold { f: f, state: initial_state } } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Unfold where F: FnMut(&mut St) -> Option { type Item = A; #[inline] fn next(&mut self) -> Option { (self.f)(&mut self.state) } #[inline] fn size_hint(&self) -> (usize, Option) { // no possible known bounds at this point (0, None) } } /// An infinite iterator starting at `start` and advancing by `step` with each /// iteration #[derive(Clone)] #[unstable(feature = "core", reason = "may be renamed or replaced by range notation adapaters")] pub struct Counter { /// The current state the counter is at (next value to be yielded) state: A, /// The amount that this iterator is stepping by step: A, } /// Creates a new counter with the specified start/step #[inline] #[unstable(feature = "core", reason = "may be renamed or replaced by range notation adapaters")] pub fn count(start: A, step: A) -> Counter { Counter{state: start, step: step} } #[stable(feature = "rust1", since = "1.0.0")] impl + Clone> Iterator for Counter { type Item = A; #[inline] fn next(&mut self) -> Option { let result = self.state.clone(); self.state = self.state.clone() + self.step.clone(); Some(result) } #[inline] fn size_hint(&self) -> (usize, Option) { (usize::MAX, None) // Too bad we can't specify an infinite lower bound } } /// An iterator over the range [start, stop) #[derive(Clone)] #[unstable(feature = "core", reason = "will be replaced by range notation")] pub struct Range { state: A, stop: A, one: A, } /// Returns an iterator over the given range [start, stop) (that is, starting /// at start (inclusive), and ending at stop (exclusive)). /// /// # Examples /// /// ``` /// let array = [0, 1, 2, 3, 4]; /// /// for i in range(0, 5) { /// println!("{}", i); /// assert_eq!(i, array[i]); /// } /// ``` #[inline] #[unstable(feature = "core", reason = "will be replaced by range notation")] pub fn range(start: A, stop: A) -> Range { Range { state: start, stop: stop, one: Int::one(), } } // FIXME: #10414: Unfortunate type bound #[unstable(feature = "core", reason = "will be replaced by range notation")] impl Iterator for Range { type Item = A; #[inline] fn next(&mut self) -> Option { if self.state < self.stop { let result = self.state.clone(); self.state = self.state + self.one; Some(result) } else { None } } #[inline] fn size_hint(&self) -> (usize, Option) { // This first checks if the elements are representable as i64. If they aren't, try u64 (to // handle cases like range(huge, huger)). We don't use usize/isize because the difference of // the i64/u64 might lie within their range. let bound = match self.state.to_i64() { Some(a) => { let sz = self.stop.to_i64().map(|b| b.checked_sub(a)); match sz { Some(Some(bound)) => bound.to_uint(), _ => None, } }, None => match self.state.to_u64() { Some(a) => { let sz = self.stop.to_u64().map(|b| b.checked_sub(a)); match sz { Some(Some(bound)) => bound.to_uint(), _ => None } }, None => None } }; match bound { Some(b) => (b, Some(b)), // Standard fallback for unbounded/unrepresentable bounds None => (0, None) } } } /// `Int` is required to ensure the range will be the same regardless of /// the direction it is consumed. #[unstable(feature = "core", reason = "will be replaced by range notation")] impl DoubleEndedIterator for Range { #[inline] fn next_back(&mut self) -> Option { if self.stop > self.state { self.stop = self.stop - self.one; Some(self.stop.clone()) } else { None } } } /// An iterator over the range [start, stop] #[derive(Clone)] #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] pub struct RangeInclusive { range: Range, done: bool, } /// Return an iterator over the range [start, stop] #[inline] #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] pub fn range_inclusive(start: A, stop: A) -> RangeInclusive { RangeInclusive { range: range(start, stop), done: false, } } #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] impl Iterator for RangeInclusive { type Item = A; #[inline] fn next(&mut self) -> Option { match self.range.next() { Some(x) => Some(x), None => { if !self.done && self.range.state == self.range.stop { self.done = true; Some(self.range.stop.clone()) } else { None } } } } #[inline] fn size_hint(&self) -> (usize, Option) { let (lo, hi) = self.range.size_hint(); if self.done { (lo, hi) } else { let lo = lo.saturating_add(1); let hi = match hi { Some(x) => x.checked_add(1), None => None }; (lo, hi) } } } #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] impl DoubleEndedIterator for RangeInclusive { #[inline] fn next_back(&mut self) -> Option { if self.range.stop > self.range.state { let result = self.range.stop.clone(); self.range.stop = self.range.stop - self.range.one; Some(result) } else if !self.done && self.range.state == self.range.stop { self.done = true; Some(self.range.stop.clone()) } else { None } } } /// An iterator over the range [start, stop) by `step`. It handles overflow by stopping. #[derive(Clone)] #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] pub struct RangeStep { state: A, stop: A, step: A, rev: bool, } /// Return an iterator over the range [start, stop) by `step`. It handles overflow by stopping. #[inline] #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] pub fn range_step(start: A, stop: A, step: A) -> RangeStep { let rev = step < Int::zero(); RangeStep{state: start, stop: stop, step: step, rev: rev} } #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] impl Iterator for RangeStep { type Item = A; #[inline] fn next(&mut self) -> Option { if (self.rev && self.state > self.stop) || (!self.rev && self.state < self.stop) { let result = self.state; match self.state.checked_add(self.step) { Some(x) => self.state = x, None => self.state = self.stop.clone() } Some(result) } else { None } } } /// An iterator over the range [start, stop] by `step`. It handles overflow by stopping. #[derive(Clone)] #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] pub struct RangeStepInclusive { state: A, stop: A, step: A, rev: bool, done: bool, } /// Return an iterator over the range [start, stop] by `step`. It handles overflow by stopping. #[inline] #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] pub fn range_step_inclusive(start: A, stop: A, step: A) -> RangeStepInclusive { let rev = step < Int::zero(); RangeStepInclusive { state: start, stop: stop, step: step, rev: rev, done: false, } } #[unstable(feature = "core", reason = "likely to be replaced by range notation and adapters")] impl Iterator for RangeStepInclusive { type Item = A; #[inline] fn next(&mut self) -> Option { if !self.done && ((self.rev && self.state >= self.stop) || (!self.rev && self.state <= self.stop)) { let result = self.state; match self.state.checked_add(self.step) { Some(x) => self.state = x, None => self.done = true } Some(result) } else { None } } } macro_rules! range_exact_iter_impl { ($($t:ty)*) => ($( #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for ::ops::Range<$t> { #[inline] fn len(&self) -> usize { debug_assert!(self.end >= self.start); (self.end - self.start) as usize } } )*) } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for ::ops::Range { type Item = A; #[inline] fn next(&mut self) -> Option { if self.start < self.end { let result = self.start; self.start = self.start + Int::one(); Some(result) } else { None } } #[inline] fn size_hint(&self) -> (usize, Option) { debug_assert!(self.end >= self.start); let hint = (self.end - self.start).to_uint(); (hint.unwrap_or(0), hint) } } range_exact_iter_impl!(usize u8 u16 u32 isize i8 i16 i32); #[cfg(target_pointer_width = "64")] range_exact_iter_impl!(u64 i64); #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for ::ops::Range { #[inline] fn next_back(&mut self) -> Option { if self.start < self.end { self.end = self.end - Int::one(); Some(self.end) } else { None } } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for ::ops::RangeFrom { type Item = A; #[inline] fn next(&mut self) -> Option { let result = self.start; self.start = self.start + Int::one(); debug_assert!(result < self.start); Some(result) } } /// An iterator that repeats an element endlessly #[derive(Clone)] #[stable(feature = "rust1", since = "1.0.0")] pub struct Repeat { element: A } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Repeat { type Item = A; #[inline] fn next(&mut self) -> Option { self.idx(0) } #[inline] fn size_hint(&self) -> (usize, Option) { (usize::MAX, None) } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Repeat { #[inline] fn next_back(&mut self) -> Option { self.idx(0) } } #[unstable(feature = "core", reason = "trait is experimental")] impl RandomAccessIterator for Repeat { #[inline] fn indexable(&self) -> usize { usize::MAX } #[inline] fn idx(&mut self, _: usize) -> Option { Some(self.element.clone()) } } type IterateState = (F, Option, bool); /// An iterator that repeatedly applies a given function, starting /// from a given seed value. #[unstable(feature = "core")] pub type Iterate = Unfold, fn(&mut IterateState) -> Option>; /// Create a new iterator that produces an infinite sequence of /// repeated applications of the given function `f`. #[unstable(feature = "core")] pub fn iterate(seed: T, f: F) -> Iterate where T: Clone, F: FnMut(T) -> T, { fn next(st: &mut IterateState) -> Option where T: Clone, F: FnMut(T) -> T, { let &mut (ref mut f, ref mut val, ref mut first) = st; if *first { *first = false; } else { match val.take() { Some(x) => { *val = Some((*f)(x)) } None => {} } } val.clone() } // coerce to a fn pointer let next: fn(&mut IterateState) -> Option = next; Unfold::new((f, Some(seed), true), next) } /// Create a new iterator that endlessly repeats the element `elt`. #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn repeat(elt: T) -> Repeat { Repeat{element: elt} } /// Functions for lexicographical ordering of sequences. /// /// Lexicographical ordering through `<`, `<=`, `>=`, `>` requires /// that the elements implement both `PartialEq` and `PartialOrd`. /// /// If two sequences are equal up until the point where one ends, /// the shorter sequence compares less. #[unstable(feature = "core", reason = "needs review and revision")] pub mod order { use cmp; use cmp::{Eq, Ord, PartialOrd, PartialEq}; use cmp::Ordering::{Equal, Less, Greater}; use option::Option; use option::Option::{Some, None}; use super::Iterator; /// Compare `a` and `b` for equality using `Eq` pub fn equals(mut a: T, mut b: S) -> bool where A: Eq, T: Iterator, S: Iterator, { loop { match (a.next(), b.next()) { (None, None) => return true, (None, _) | (_, None) => return false, (Some(x), Some(y)) => if x != y { return false }, } } } /// Order `a` and `b` lexicographically using `Ord` pub fn cmp(mut a: T, mut b: S) -> cmp::Ordering where A: Ord, T: Iterator, S: Iterator, { loop { match (a.next(), b.next()) { (None, None) => return Equal, (None, _ ) => return Less, (_ , None) => return Greater, (Some(x), Some(y)) => match x.cmp(&y) { Equal => (), non_eq => return non_eq, }, } } } /// Order `a` and `b` lexicographically using `PartialOrd` pub fn partial_cmp(mut a: T, mut b: S) -> Option where A: PartialOrd, T: Iterator, S: Iterator, { loop { match (a.next(), b.next()) { (None, None) => return Some(Equal), (None, _ ) => return Some(Less), (_ , None) => return Some(Greater), (Some(x), Some(y)) => match x.partial_cmp(&y) { Some(Equal) => (), non_eq => return non_eq, }, } } } /// Compare `a` and `b` for equality (Using partial equality, `PartialEq`) pub fn eq(mut a: L, mut b: R) -> bool where A: PartialEq, L: Iterator, R: Iterator, { loop { match (a.next(), b.next()) { (None, None) => return true, (None, _) | (_, None) => return false, (Some(x), Some(y)) => if !x.eq(&y) { return false }, } } } /// Compare `a` and `b` for nonequality (Using partial equality, `PartialEq`) pub fn ne(mut a: L, mut b: R) -> bool where A: PartialEq, L: Iterator, R: Iterator, { loop { match (a.next(), b.next()) { (None, None) => return false, (None, _) | (_, None) => return true, (Some(x), Some(y)) => if x.ne(&y) { return true }, } } } /// Return `a` < `b` lexicographically (Using partial order, `PartialOrd`) pub fn lt(mut a: T, mut b: S) -> bool where A: PartialOrd, T: Iterator, S: Iterator, { loop { match (a.next(), b.next()) { (None, None) => return false, (None, _ ) => return true, (_ , None) => return false, (Some(x), Some(y)) => if x.ne(&y) { return x.lt(&y) }, } } } /// Return `a` <= `b` lexicographically (Using partial order, `PartialOrd`) pub fn le(mut a: T, mut b: S) -> bool where A: PartialOrd, T: Iterator, S: Iterator, { loop { match (a.next(), b.next()) { (None, None) => return true, (None, _ ) => return true, (_ , None) => return false, (Some(x), Some(y)) => if x.ne(&y) { return x.le(&y) }, } } } /// Return `a` > `b` lexicographically (Using partial order, `PartialOrd`) pub fn gt(mut a: T, mut b: S) -> bool where A: PartialOrd, T: Iterator, S: Iterator, { loop { match (a.next(), b.next()) { (None, None) => return false, (None, _ ) => return false, (_ , None) => return true, (Some(x), Some(y)) => if x.ne(&y) { return x.gt(&y) }, } } } /// Return `a` >= `b` lexicographically (Using partial order, `PartialOrd`) pub fn ge(mut a: T, mut b: S) -> bool where A: PartialOrd, T: Iterator, S: Iterator, { loop { match (a.next(), b.next()) { (None, None) => return true, (None, _ ) => return false, (_ , None) => return true, (Some(x), Some(y)) => if x.ne(&y) { return x.ge(&y) }, } } } }