Skip to content

Commit 6f18bb5

Browse files
committed
iter: add a find function
1 parent 7fed480 commit 6f18bb5

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

src/libcore/iter.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ much easier to implement.
4141
4242
*/
4343

44+
use option::{Option, Some, None};
45+
4446
pub trait Times {
4547
fn times(&self, it: &fn() -> bool);
4648
}
@@ -104,6 +106,27 @@ pub fn all<T>(predicate: &fn(T) -> bool, iter: &fn(f: &fn(T) -> bool)) -> bool {
104106
true
105107
}
106108

109+
/**
110+
* Return the first element where `predicate` returns `true`, otherwise return `Npne` if no element
111+
* is found.
112+
*
113+
* # Example:
114+
*
115+
* ~~~~
116+
* let xs = ~[1u, 2, 3, 4, 5, 6];
117+
* assert_eq!(*find(|& &x: & &uint| x > 3, |f| xs.each(f)).unwrap(), 4);
118+
* ~~~~
119+
*/
120+
#[inline(always)]
121+
pub fn find<T>(predicate: &fn(&T) -> bool, iter: &fn(f: &fn(T) -> bool)) -> Option<T> {
122+
for iter |x| {
123+
if predicate(&x) {
124+
return Some(x);
125+
}
126+
}
127+
None
128+
}
129+
107130
#[cfg(test)]
108131
mod tests {
109132
use super::*;
@@ -128,4 +151,10 @@ mod tests {
128151
assert!(all(|x: uint| x < 6, |f| uint::range(1, 6, f)));
129152
assert!(!all(|x: uint| x < 5, |f| uint::range(1, 6, f)));
130153
}
154+
155+
#[test]
156+
fn test_find() {
157+
let xs = ~[1u, 2, 3, 4, 5, 6];
158+
assert_eq!(*find(|& &x: & &uint| x > 3, |f| xs.each(f)).unwrap(), 4);
159+
}
131160
}

0 commit comments

Comments
 (0)