Implement ExactSizeIterator for Punctuated iterators
diff --git a/src/punctuated.rs b/src/punctuated.rs
index ac6492a..25bcfc3 100644
--- a/src/punctuated.rs
+++ b/src/punctuated.rs
@@ -361,6 +361,12 @@
     }
 }
 
+impl<'a, T, P> ExactSizeIterator for Pairs<'a, T, P> {
+    fn len(&self) -> usize {
+        self.inner.len() + self.last.len()
+    }
+}
+
 /// An iterator over mutably borrowed pairs of type `Pair<&mut T, &mut P>`.
 ///
 /// Refer to the [module documentation] for details about punctuated sequences.
@@ -382,6 +388,12 @@
     }
 }
 
+impl<'a, T, P> ExactSizeIterator for PairsMut<'a, T, P> {
+    fn len(&self) -> usize {
+        self.inner.len() + self.last.len()
+    }
+}
+
 /// An iterator over owned pairs of type `Pair<T, P>`.
 ///
 /// Refer to the [module documentation] for details about punctuated sequences.
@@ -403,6 +415,12 @@
     }
 }
 
+impl<T, P> ExactSizeIterator for IntoPairs<T, P> {
+    fn len(&self) -> usize {
+        self.inner.len() + self.last.len()
+    }
+}
+
 /// An iterator over owned values of type `T`.
 ///
 /// Refer to the [module documentation] for details about punctuated sequences.
@@ -424,13 +442,19 @@
     }
 }
 
+impl<T, P> ExactSizeIterator for IntoIter<T, P> {
+    fn len(&self) -> usize {
+        self.inner.len() + self.last.len()
+    }
+}
+
 /// An iterator over borrowed values of type `&T`.
 ///
 /// Refer to the [module documentation] for details about punctuated sequences.
 ///
 /// [module documentation]: index.html
 pub struct Iter<'a, T: 'a> {
-    inner: Box<Iterator<Item = &'a T> + 'a>,
+    inner: Box<ExactSizeIterator<Item = &'a T> + 'a>,
 }
 
 struct PrivateIter<'a, T: 'a, P: 'a> {
@@ -457,6 +481,12 @@
     }
 }
 
+impl<'a, T> ExactSizeIterator for Iter<'a, T> {
+    fn len(&self) -> usize {
+        self.inner.len()
+    }
+}
+
 impl<'a, T, P> Iterator for PrivateIter<'a, T, P> {
     type Item = &'a T;
 
@@ -468,13 +498,19 @@
     }
 }
 
+impl<'a, T, P> ExactSizeIterator for PrivateIter<'a, T, P> {
+    fn len(&self) -> usize {
+        self.inner.len() + self.last.len()
+    }
+}
+
 /// An iterator over mutably borrowed values of type `&mut T`.
 ///
 /// Refer to the [module documentation] for details about punctuated sequences.
 ///
 /// [module documentation]: index.html
 pub struct IterMut<'a, T: 'a> {
-    inner: Box<Iterator<Item = &'a mut T> + 'a>,
+    inner: Box<ExactSizeIterator<Item = &'a mut T> + 'a>,
 }
 
 struct PrivateIterMut<'a, T: 'a, P: 'a> {
@@ -490,6 +526,12 @@
     }
 }
 
+impl<'a, T> ExactSizeIterator for IterMut<'a, T> {
+    fn len(&self) -> usize {
+        self.inner.len()
+    }
+}
+
 impl<'a, T, P> Iterator for PrivateIterMut<'a, T, P> {
     type Item = &'a mut T;
 
@@ -501,6 +543,12 @@
     }
 }
 
+impl<'a, T, P> ExactSizeIterator for PrivateIterMut<'a, T, P> {
+    fn len(&self) -> usize {
+        self.inner.len() + self.last.len()
+    }
+}
+
 /// A single syntax tree node of type `T` followed by its trailing punctuation
 /// of type `P` if any.
 ///