From b2af32a000a61b26564878dde6b73cfa71138ff8 Mon Sep 17 00:00:00 2001
From: gnzlbg <gonzalobg88@gmail.com>
Date: Mon, 5 Feb 2018 21:27:19 +0100
Subject: [PATCH 1/4] add is_sorted, is_sorted_by, is_sorted_by_key

---
 src/lib.rs | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 71 insertions(+)

diff --git a/src/lib.rs b/src/lib.rs
index 247e6fe81..a501ebbcf 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -953,6 +953,77 @@ pub trait Itertools : Iterator {
         peeking_take_while::peeking_take_while(self, accept)
     }
 
+    /// Returns `true` if the elements of the iterator are sorted
+    /// in increasing order.
+    ///
+    /// ```
+    /// # use itertools::Itertools;
+    /// let v = vec![0, 1, 2 , 3];
+    /// assert!(v.iter().is_sorted());
+    ///
+    /// let v = vec![0, 1, 2 , -1];
+    /// assert!(!v.iter().is_sorted());
+    /// ```
+    fn is_sorted(self) -> bool
+        where Self: Sized,
+              Self::Item: Ord,
+    {
+        self.is_sorted_by(|a, b| Ord::cmp(&a, &b))
+    }
+
+    /// Returns `true` if the elements of the iterator
+    /// are sorted according to the `comparison` function.
+    ///
+    /// ```
+    /// # use itertools::Itertools;
+    /// # use std::cmp::Ordering;
+    /// // Is an iterator sorted in decreasing order?
+    /// fn decr<T: Ord>(a: &T, b: &T) -> Ordering {
+    ///     a.cmp(b).reverse()
+    /// }
+    ///
+    /// let v = vec![3, 2, 1 , 0];
+    /// assert!(v.iter().is_sorted_by(decr));
+    ///
+    /// let v = vec![3, 2, 1 , 4];
+    /// assert!(!v.iter().is_sorted_by(decr));
+    /// ```
+    fn is_sorted_by<F>(mut self, mut compare: F) -> bool
+        where Self: Sized,
+              Self::Item: Ord,
+              F: FnMut(&Self::Item, &Self::Item) -> Ordering, 
+    {
+        let first = self.next();
+        if let Some(mut first) = first {
+            while let Some(second) = self.next() {
+                if compare(&first, &second) == Ordering::Greater {
+                    return false;
+                }
+                first = second;
+            }
+        }
+        true
+    }
+
+    /// Returns `true` if the elements of the iterator
+    /// are sorted according to the `key` extraction function.
+    ///
+    /// ```
+    /// # use itertools::Itertools;
+    /// let v = vec![0_i32, -1, 2, -3];
+    /// assert!(v.iter().is_sorted_by_key(|v| v.abs()));
+    ///
+    /// let v = vec![0_i32, -1, 2, 0];
+    /// assert!(!v.iter().is_sorted_by_key(|v| v.abs()));
+    /// ```
+    fn is_sorted_by_key<F, B>(self, mut key: F) -> bool
+        where Self: Sized,
+              B: Ord,
+              F: FnMut(&Self::Item) -> B, 
+    {
+        self.map(|v| key(&v)).is_sorted()
+    }
+
     /// Return an iterator adaptor that borrows from a `Clone`-able iterator
     /// to only pick off elements while the predicate `accept` returns `true`.
     ///

From c316e3553bb5e657d2286f6140b45cd52b7c1371 Mon Sep 17 00:00:00 2001
From: gnzlbg <gonzalobg88@gmail.com>
Date: Tue, 6 Feb 2018 01:09:05 +0100
Subject: [PATCH 2/4] use &mut self and all

---
 src/lib.rs | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index a501ebbcf..b1a71a733 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -964,7 +964,7 @@ pub trait Itertools : Iterator {
     /// let v = vec![0, 1, 2 , -1];
     /// assert!(!v.iter().is_sorted());
     /// ```
-    fn is_sorted(self) -> bool
+    fn is_sorted(&mut self) -> bool
         where Self: Sized,
               Self::Item: Ord,
     {
@@ -988,18 +988,21 @@ pub trait Itertools : Iterator {
     /// let v = vec![3, 2, 1 , 4];
     /// assert!(!v.iter().is_sorted_by(decr));
     /// ```
-    fn is_sorted_by<F>(mut self, mut compare: F) -> bool
+    fn is_sorted_by<F>(&mut self, mut compare: F) -> bool
         where Self: Sized,
               Self::Item: Ord,
-              F: FnMut(&Self::Item, &Self::Item) -> Ordering, 
+              F: FnMut(&Self::Item, &Self::Item) -> Ordering,
     {
         let first = self.next();
         if let Some(mut first) = first {
-            while let Some(second) = self.next() {
+            if !self.all(|second| {
                 if compare(&first, &second) == Ordering::Greater {
                     return false;
                 }
                 first = second;
+                true
+            }) {
+                return false;
             }
         }
         true
@@ -1016,10 +1019,10 @@ pub trait Itertools : Iterator {
     /// let v = vec![0_i32, -1, 2, 0];
     /// assert!(!v.iter().is_sorted_by_key(|v| v.abs()));
     /// ```
-    fn is_sorted_by_key<F, B>(self, mut key: F) -> bool
+    fn is_sorted_by_key<F, B>(&mut self, mut key: F) -> bool
         where Self: Sized,
               B: Ord,
-              F: FnMut(&Self::Item) -> B, 
+              F: FnMut(&Self::Item) -> B,
     {
         self.map(|v| key(&v)).is_sorted()
     }

From 6ecbb9614075581b063737bae4db7e1db7795ea4 Mon Sep 17 00:00:00 2001
From: gnzlbg <gonzalobg88@gmail.com>
Date: Tue, 6 Feb 2018 01:20:46 +0100
Subject: [PATCH 3/4] remove unnecessary branch

---
 src/lib.rs | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index b1a71a733..b8fa51c15 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -995,15 +995,13 @@ pub trait Itertools : Iterator {
     {
         let first = self.next();
         if let Some(mut first) = first {
-            if !self.all(|second| {
+            return self.all(|second| {
                 if compare(&first, &second) == Ordering::Greater {
                     return false;
                 }
                 first = second;
                 true
-            }) {
-                return false;
-            }
+            });
         }
         true
     }

From 8ca04cfa4d18b81491999910c5b785d6264d6106 Mon Sep 17 00:00:00 2001
From: gnzlbg <gonzalobg88@gmail.com>
Date: Tue, 6 Feb 2018 19:51:08 +0100
Subject: [PATCH 4/4] move to the regular methods section

---
 src/lib.rs | 144 ++++++++++++++++++++++++++---------------------------
 1 file changed, 72 insertions(+), 72 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index b8fa51c15..e6cad757b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -953,78 +953,6 @@ pub trait Itertools : Iterator {
         peeking_take_while::peeking_take_while(self, accept)
     }
 
-    /// Returns `true` if the elements of the iterator are sorted
-    /// in increasing order.
-    ///
-    /// ```
-    /// # use itertools::Itertools;
-    /// let v = vec![0, 1, 2 , 3];
-    /// assert!(v.iter().is_sorted());
-    ///
-    /// let v = vec![0, 1, 2 , -1];
-    /// assert!(!v.iter().is_sorted());
-    /// ```
-    fn is_sorted(&mut self) -> bool
-        where Self: Sized,
-              Self::Item: Ord,
-    {
-        self.is_sorted_by(|a, b| Ord::cmp(&a, &b))
-    }
-
-    /// Returns `true` if the elements of the iterator
-    /// are sorted according to the `comparison` function.
-    ///
-    /// ```
-    /// # use itertools::Itertools;
-    /// # use std::cmp::Ordering;
-    /// // Is an iterator sorted in decreasing order?
-    /// fn decr<T: Ord>(a: &T, b: &T) -> Ordering {
-    ///     a.cmp(b).reverse()
-    /// }
-    ///
-    /// let v = vec![3, 2, 1 , 0];
-    /// assert!(v.iter().is_sorted_by(decr));
-    ///
-    /// let v = vec![3, 2, 1 , 4];
-    /// assert!(!v.iter().is_sorted_by(decr));
-    /// ```
-    fn is_sorted_by<F>(&mut self, mut compare: F) -> bool
-        where Self: Sized,
-              Self::Item: Ord,
-              F: FnMut(&Self::Item, &Self::Item) -> Ordering,
-    {
-        let first = self.next();
-        if let Some(mut first) = first {
-            return self.all(|second| {
-                if compare(&first, &second) == Ordering::Greater {
-                    return false;
-                }
-                first = second;
-                true
-            });
-        }
-        true
-    }
-
-    /// Returns `true` if the elements of the iterator
-    /// are sorted according to the `key` extraction function.
-    ///
-    /// ```
-    /// # use itertools::Itertools;
-    /// let v = vec![0_i32, -1, 2, -3];
-    /// assert!(v.iter().is_sorted_by_key(|v| v.abs()));
-    ///
-    /// let v = vec![0_i32, -1, 2, 0];
-    /// assert!(!v.iter().is_sorted_by_key(|v| v.abs()));
-    /// ```
-    fn is_sorted_by_key<F, B>(&mut self, mut key: F) -> bool
-        where Self: Sized,
-              B: Ord,
-              F: FnMut(&Self::Item) -> B,
-    {
-        self.map(|v| key(&v)).is_sorted()
-    }
-
     /// Return an iterator adaptor that borrows from a `Clone`-able iterator
     /// to only pick off elements while the predicate `accept` returns `true`.
     ///
@@ -1806,6 +1734,78 @@ pub trait Itertools : Iterator {
         v
     }
 
+    /// Returns `true` if the elements of the iterator are sorted
+    /// in increasing order.
+    ///
+    /// ```
+    /// # use itertools::Itertools;
+    /// let v = vec![0, 1, 2 , 3];
+    /// assert!(v.iter().is_sorted());
+    ///
+    /// let v = vec![0, 1, 2 , -1];
+    /// assert!(!v.iter().is_sorted());
+    /// ```
+    fn is_sorted(&mut self) -> bool
+        where Self: Sized,
+              Self::Item: Ord,
+    {
+        self.is_sorted_by(|a, b| Ord::cmp(&a, &b))
+    }
+
+    /// Returns `true` if the elements of the iterator
+    /// are sorted according to the `comparison` function.
+    ///
+    /// ```
+    /// # use itertools::Itertools;
+    /// # use std::cmp::Ordering;
+    /// // Is an iterator sorted in decreasing order?
+    /// fn decr<T: Ord>(a: &T, b: &T) -> Ordering {
+    ///     a.cmp(b).reverse()
+    /// }
+    ///
+    /// let v = vec![3, 2, 1 , 0];
+    /// assert!(v.iter().is_sorted_by(decr));
+    ///
+    /// let v = vec![3, 2, 1 , 4];
+    /// assert!(!v.iter().is_sorted_by(decr));
+    /// ```
+    fn is_sorted_by<F>(&mut self, mut compare: F) -> bool
+        where Self: Sized,
+              Self::Item: Ord,
+              F: FnMut(&Self::Item, &Self::Item) -> Ordering,
+    {
+        let first = self.next();
+        if let Some(mut first) = first {
+            return self.all(|second| {
+                if compare(&first, &second) == Ordering::Greater {
+                    return false;
+                }
+                first = second;
+                true
+            });
+        }
+        true
+    }
+
+    /// Returns `true` if the elements of the iterator
+    /// are sorted according to the `key` extraction function.
+    ///
+    /// ```
+    /// # use itertools::Itertools;
+    /// let v = vec![0_i32, -1, 2, -3];
+    /// assert!(v.iter().is_sorted_by_key(|v| v.abs()));
+    ///
+    /// let v = vec![0_i32, -1, 2, 0];
+    /// assert!(!v.iter().is_sorted_by_key(|v| v.abs()));
+    /// ```
+    fn is_sorted_by_key<F, B>(&mut self, mut key: F) -> bool
+        where Self: Sized,
+              B: Ord,
+              F: FnMut(&Self::Item) -> B,
+    {
+        self.map(|v| key(&v)).is_sorted()
+    }
+
     /// Collect all iterator elements into one of two
     /// partitions. Unlike `Iterator::partition`, each partition may
     /// have a distinct type.