@@ -41,6 +41,9 @@ much easier to implement.
41
41
42
42
*/
43
43
44
+ use cmp:: Ord ;
45
+ use option:: { Option , Some , None } ;
46
+
44
47
pub trait Times {
45
48
fn times ( & self , it : & fn ( ) -> bool ) ;
46
49
}
@@ -104,6 +107,78 @@ pub fn all<T>(predicate: &fn(T) -> bool, iter: &fn(f: &fn(T) -> bool)) -> bool {
104
107
true
105
108
}
106
109
110
+ /**
111
+ * Return the first element where `predicate` returns `true`. Return `None` if no element 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
+
130
+ /**
131
+ * Return the largest item yielded by an iterator. Return `None` if the iterator is empty.
132
+ *
133
+ * # Example:
134
+ *
135
+ * ~~~~
136
+ * let xs = ~[8, 2, 3, 1, -5, 9, 11, 15];
137
+ * assert_eq!(max(|f| xs.each(f)).unwrap(), &15);
138
+ * ~~~~
139
+ */
140
+ #[ inline]
141
+ pub fn max < T : Ord > ( iter : & fn ( f : & fn ( T ) -> bool ) ) -> Option < T > {
142
+ let mut result = None ;
143
+ for iter |x| {
144
+ match result {
145
+ Some ( ref mut y) => {
146
+ if x > * y {
147
+ * y = x;
148
+ }
149
+ }
150
+ None => result = Some ( x)
151
+ }
152
+ }
153
+ result
154
+ }
155
+
156
+ /**
157
+ * Return the smallest item yielded by an iterator. Return `None` if the iterator is empty.
158
+ *
159
+ * # Example:
160
+ *
161
+ * ~~~~
162
+ * let xs = ~[8, 2, 3, 1, -5, 9, 11, 15];
163
+ * assert_eq!(max(|f| xs.each(f)).unwrap(), &-5);
164
+ * ~~~~
165
+ */
166
+ #[ inline]
167
+ pub fn min < T : Ord > ( iter : & fn ( f : & fn ( T ) -> bool ) ) -> Option < T > {
168
+ let mut result = None ;
169
+ for iter |x| {
170
+ match result {
171
+ Some ( ref mut y) => {
172
+ if x < * y {
173
+ * y = x;
174
+ }
175
+ }
176
+ None => result = Some ( x)
177
+ }
178
+ }
179
+ result
180
+ }
181
+
107
182
#[ cfg( test) ]
108
183
mod tests {
109
184
use super :: * ;
@@ -128,4 +203,22 @@ mod tests {
128
203
assert ! ( all( |x: uint| x < 6 , |f| uint:: range( 1 , 6 , f) ) ) ;
129
204
assert ! ( !all( |x: uint| x < 5 , |f| uint:: range( 1 , 6 , f) ) ) ;
130
205
}
206
+
207
+ #[ test]
208
+ fn test_find ( ) {
209
+ let xs = ~[ 1 u, 2 , 3 , 4 , 5 , 6 ] ;
210
+ assert_eq ! ( * find( |& & x: & & uint| x > 3 , |f| xs. each( f) ) . unwrap( ) , 4 ) ;
211
+ }
212
+
213
+ #[ test]
214
+ fn test_max ( ) {
215
+ let xs = ~[ 8 , 2 , 3 , 1 , -5 , 9 , 11 , 15 ] ;
216
+ assert_eq ! ( max( |f| xs. each( f) ) . unwrap( ) , & 15 ) ;
217
+ }
218
+
219
+ #[ test]
220
+ fn test_min ( ) {
221
+ let xs = ~[ 8 , 2 , 3 , 1 , -5 , 9 , 11 , 15 ] ;
222
+ assert_eq ! ( min( |f| xs. each( f) ) . unwrap( ) , & -5 ) ;
223
+ }
131
224
}
0 commit comments