@@ -53,6 +53,8 @@ pub trait IteratorUtil<A> {
53
53
fn last ( & mut self ) -> A ;
54
54
fn fold < B > ( & mut self , start : B , f : & fn ( B , A ) -> B ) -> B ;
55
55
fn count ( & mut self ) -> uint ;
56
+ fn all ( & mut self , f : & fn ( & A ) -> bool ) -> bool ;
57
+ fn any ( & mut self , f : & fn ( & A ) -> bool ) -> bool ;
56
58
}
57
59
58
60
/// Iterator adaptors provided for every `Iterator` implementation. The adaptor objects are also
@@ -204,6 +206,18 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
204
206
/// Count the number of an iterator elemenrs
205
207
#[ inline( always) ]
206
208
fn count ( & mut self ) -> uint { self . fold ( 0 , |cnt, _x| cnt + 1 ) }
209
+
210
+ #[ inline( always) ]
211
+ fn all ( & mut self , f : & fn ( & A ) -> bool ) -> bool {
212
+ for self . advance |x| { if !f ( & x) { return false ; } }
213
+ return true ;
214
+ }
215
+
216
+ #[ inline( always) ]
217
+ fn any ( & mut self , f : & fn ( & A ) -> bool ) -> bool {
218
+ for self . advance |x| { if f ( & x) { return true ; } }
219
+ return false ;
220
+ }
207
221
}
208
222
209
223
pub trait AdditiveIterator < A > {
@@ -754,4 +768,21 @@ mod tests {
754
768
assert_eq ! ( v. slice( 0 , 0 ) . iter( ) . transform( |& x| x) . min( ) , None ) ;
755
769
}
756
770
771
+ #[ test]
772
+ fn test_all ( ) {
773
+ let v = ~& [ 1 , 2 , 3 , 4 , 5 ] ;
774
+ assert ! ( v. iter( ) . all( |& x| * x < 10 ) ) ;
775
+ assert ! ( !v. iter( ) . all( |& x| x. is_even( ) ) ) ;
776
+ assert ! ( !v. iter( ) . all( |& x| * x > 100 ) ) ;
777
+ assert ! ( v. slice( 0 , 0 ) . iter( ) . all( |_| fail!( ) ) ) ;
778
+ }
779
+
780
+ #[ test]
781
+ fn test_any ( ) {
782
+ let v = ~& [ 1 , 2 , 3 , 4 , 5 ] ;
783
+ assert ! ( v. iter( ) . any( |& x| * x < 10 ) ) ;
784
+ assert ! ( v. iter( ) . any( |& x| x. is_even( ) ) ) ;
785
+ assert ! ( !v. iter( ) . any( |& x| * x > 100 ) ) ;
786
+ assert ! ( !v. slice( 0 , 0 ) . iter( ) . any( |_| fail!( ) ) ) ;
787
+ }
757
788
}
0 commit comments