From 2df66a84cd64211c22e58c48df07ce63bf5469a3 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 15 Jun 2013 17:56:26 -0400 Subject: [PATCH] iterator: add a `position` adaptor --- src/libstd/iterator.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) 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()); + } }