diff --git a/src/libstd/iterator.rs b/src/libstd/iterator.rs
index 7aa273f7cd8..a8969f1da6e 100644
--- a/src/libstd/iterator.rs
+++ b/src/libstd/iterator.rs
@@ -311,6 +311,9 @@ pub trait IteratorUtil {
/// Return the first element satisfying the specified predicate
fn find(&mut self, predicate: &fn(&A) -> bool) -> Option;
+
+ /// Return the index of the first element satisfying the specified predicate
+ fn position(&mut self, predicate: &fn(A) -> bool) -> Option;
}
/// Iterator adaptors provided for every `Iterator` implementation. The adaptor objects are also
@@ -451,6 +454,19 @@ impl> IteratorUtil for T {
}
None
}
+
+ /// Return the index of the first element satisfying the specified predicate
+ #[inline]
+ fn position(&mut self, predicate: &fn(A) -> bool) -> Option {
+ let mut i = 0;
+ for self.advance |x| {
+ if predicate(x) {
+ return Some(i);
+ }
+ i += 1;
+ }
+ None
+ }
}
/// A trait for iterators over elements which can be added together
@@ -1075,4 +1091,12 @@ mod tests {
assert_eq!(*v.iter().find(|x| *x % 3 == 0).unwrap(), 3);
assert!(v.iter().find(|x| *x % 12 == 0).is_none());
}
+
+ #[test]
+ fn test_position() {
+ let v = &[1, 3, 9, 27, 103, 14, 11];
+ assert_eq!(v.iter().position(|x| *x & 1 == 0).unwrap(), 5);
+ assert_eq!(v.iter().position(|x| *x % 3 == 0).unwrap(), 1);
+ assert!(v.iter().position(|x| *x % 12 == 0).is_none());
+ }
}