@@ -706,15 +706,55 @@ fn count<T>(x: T, v: [const T]) -> uint {
706
706
/*
707
707
Function: find
708
708
709
- Search for an element that matches a given predicate
709
+ Search for the first element that matches a given predicate
710
710
711
711
Apply function `f` to each element of `v`, starting from the first.
712
712
When function `f` returns true then an option containing the element
713
713
is returned. If `f` matches no elements then none is returned.
714
714
*/
715
715
fn find < T : copy > ( v : [ T ] , f : fn ( T ) -> bool ) -> option:: t < T > {
716
- for elt: T in v { if f ( elt) { ret some ( elt) ; } }
717
- ret none;
716
+ find_from ( v, 0 u, len ( v) , f)
717
+ }
718
+
719
+ /*
720
+ Function: find_from
721
+
722
+ Search for the first element that matches a given predicate within a range
723
+
724
+ Apply function `f` to each element of `v` within the range [`start`, `end`).
725
+ When function `f` returns true then an option containing the element
726
+ is returned. If `f` matches no elements then none is returned.
727
+ */
728
+ fn find_from < T : copy > ( v : [ T ] , start : uint , end : uint , f : fn ( T ) -> bool ) ->
729
+ option:: t < T > {
730
+ option:: map ( position_from ( v, start, end, f) ) { |i| v[ i] }
731
+ }
732
+
733
+ /*
734
+ Function: rfind
735
+
736
+ Search for the last element that matches a given predicate
737
+
738
+ Apply function `f` to each element of `v` in reverse order. When function `f`
739
+ returns true then an option containing the element is returned. If `f`
740
+ matches no elements then none is returned.
741
+ */
742
+ fn rfind < T : copy > ( v : [ T ] , f : fn ( T ) -> bool ) -> option:: t < T > {
743
+ rfind_from ( v, 0 u, len ( v) , f)
744
+ }
745
+
746
+ /*
747
+ Function: rfind_from
748
+
749
+ Search for the last element that matches a given predicate within a range
750
+
751
+ Apply function `f` to each element of `v` in reverse order within the range
752
+ [`start`, `end`). When function `f` returns true then an option containing
753
+ the element is returned. If `f` matches no elements then none is returned.
754
+ */
755
+ fn rfind_from < T : copy > ( v : [ T ] , start : uint , end : uint , f : fn ( T ) -> bool ) ->
756
+ option:: t < T > {
757
+ option:: map ( rposition_from ( v, start, end, f) ) { |i| v[ i] }
718
758
}
719
759
720
760
/*
@@ -1673,6 +1713,46 @@ mod tests {
1673
1713
assert position_from ( v, 4 u, 4 u, f) == none;
1674
1714
}
1675
1715
1716
+ #[ test]
1717
+ fn test_find ( ) {
1718
+ assert find( [ ] , f) == none;
1719
+
1720
+ fn f ( xy : ( int , char ) ) -> bool { let ( _x, y) = xy; y == 'b' }
1721
+ fn g ( xy : ( int , char ) ) -> bool { let ( _x, y) = xy; y == 'd' }
1722
+ let v = [ ( 0 , 'a' ) , ( 1 , 'b' ) , ( 2 , 'c' ) , ( 3 , 'b' ) ] ;
1723
+
1724
+ assert find( v, f) == some ( ( 1 , 'b' ) ) ;
1725
+ assert find( v, g) == none;
1726
+ }
1727
+
1728
+ #[ test]
1729
+ fn test_find_from ( ) {
1730
+ assert find_from ( [ ] , 0 u, 0 u, f) == none;
1731
+
1732
+ fn f ( xy : ( int , char ) ) -> bool { let ( _x, y) = xy; y == 'b' }
1733
+ let v = [ ( 0 , 'a' ) , ( 1 , 'b' ) , ( 2 , 'c' ) , ( 3 , 'b' ) ] ;
1734
+
1735
+ assert find_from( v, 0 u, 0 u, f) == none;
1736
+ assert find_from( v, 0 u, 1 u, f) == none;
1737
+ assert find_from( v, 0 u, 2 u, f) == some ( ( 1 , 'b' ) ) ;
1738
+ assert find_from( v, 0 u, 3 u, f) == some ( ( 1 , 'b' ) ) ;
1739
+ assert find_from( v, 0 u, 4 u, f) == some ( ( 1 , 'b' ) ) ;
1740
+
1741
+ assert find_from( v, 1 u, 1 u, f) == none;
1742
+ assert find_from( v, 1 u, 2 u, f) == some ( ( 1 , 'b' ) ) ;
1743
+ assert find_from( v, 1 u, 3 u, f) == some ( ( 1 , 'b' ) ) ;
1744
+ assert find_from( v, 1 u, 4 u, f) == some ( ( 1 , 'b' ) ) ;
1745
+
1746
+ assert find_from( v, 2 u, 2 u, f) == none;
1747
+ assert find_from( v, 2 u, 3 u, f) == none;
1748
+ assert find_from( v, 2 u, 4 u, f) == some ( ( 3 , 'b' ) ) ;
1749
+
1750
+ assert find_from( v, 3 u, 3 u, f) == none;
1751
+ assert find_from( v, 3 u, 4 u, f) == some ( ( 3 , 'b' ) ) ;
1752
+
1753
+ assert find_from( v, 4 u, 4 u, f) == none;
1754
+ }
1755
+
1676
1756
#[ test]
1677
1757
fn test_rposition ( ) {
1678
1758
assert find( [ ] , f) == none;
@@ -1712,6 +1792,48 @@ mod tests {
1712
1792
1713
1793
assert rposition_from ( v, 4 u, 4 u, f) == none;
1714
1794
}
1795
+
1796
+ #[ test]
1797
+ fn test_rfind ( ) {
1798
+ assert rfind( [ ] , f) == none;
1799
+
1800
+ fn f ( xy : ( int , char ) ) -> bool { let ( _x, y) = xy; y == 'b' }
1801
+ fn g ( xy : ( int , char ) ) -> bool { let ( _x, y) = xy; y == 'd' }
1802
+ let v = [ ( 0 , 'a' ) , ( 1 , 'b' ) , ( 2 , 'c' ) , ( 3 , 'b' ) ] ;
1803
+
1804
+ assert rfind( v, f) == some ( ( 3 , 'b' ) ) ;
1805
+ assert rfind( v, g) == none;
1806
+ }
1807
+
1808
+ #[ test]
1809
+ fn test_rfind_from ( ) {
1810
+ assert rfind_from ( [ ] , 0 u, 0 u, f) == none;
1811
+
1812
+ fn f ( xy : ( int , char ) ) -> bool { let ( _x, y) = xy; y == 'b' }
1813
+ let v = [ ( 0 , 'a' ) , ( 1 , 'b' ) , ( 2 , 'c' ) , ( 3 , 'b' ) ] ;
1814
+
1815
+ assert rfind_from( v, 0 u, 0 u, f) == none;
1816
+ assert rfind_from( v, 0 u, 1 u, f) == none;
1817
+ assert rfind_from( v, 0 u, 2 u, f) == some ( ( 1 , 'b' ) ) ;
1818
+ assert rfind_from( v, 0 u, 3 u, f) == some ( ( 1 , 'b' ) ) ;
1819
+ assert rfind_from( v, 0 u, 4 u, f) == some ( ( 3 , 'b' ) ) ;
1820
+
1821
+ assert rfind_from( v, 1 u, 1 u, f) == none;
1822
+ assert rfind_from( v, 1 u, 2 u, f) == some ( ( 1 , 'b' ) ) ;
1823
+ assert rfind_from( v, 1 u, 3 u, f) == some ( ( 1 , 'b' ) ) ;
1824
+ assert rfind_from( v, 1 u, 4 u, f) == some ( ( 3 , 'b' ) ) ;
1825
+
1826
+ assert rfind_from( v, 2 u, 2 u, f) == none;
1827
+ assert rfind_from( v, 2 u, 3 u, f) == none;
1828
+ assert rfind_from( v, 2 u, 4 u, f) == some ( ( 3 , 'b' ) ) ;
1829
+
1830
+ assert rfind_from( v, 3 u, 3 u, f) == none;
1831
+ assert rfind_from( v, 3 u, 4 u, f) == some ( ( 3 , 'b' ) ) ;
1832
+
1833
+ assert rfind_from( v, 4 u, 4 u, f) == none;
1834
+ }
1835
+
1836
+ #[ test]
1715
1837
fn reverse_and_reversed ( ) {
1716
1838
let v: [ mutable int] = [ mutable 10 , 20 ] ;
1717
1839
assert ( v[ 0 ] == 10 ) ;
0 commit comments