@@ -991,7 +991,7 @@ pub fn connect<T:Copy>(v: &[~[T]], sep: &T) -> ~[T] {
991
991
* ~~~
992
992
*
993
993
*/
994
- pub fn foldl<T, U>(z: T, v: &[U], p: &fn(t: T, u: &U) -> T) -> T {
994
+ pub fn foldl<'a, T, U>(z: T, v: &'a [U], p: &fn(t: T, u: &'a U) -> T) -> T {
995
995
let mut accum = z;
996
996
let mut i = 0;
997
997
let l = v.len();
@@ -1023,12 +1023,13 @@ pub fn foldl<T, U>(z: T, v: &[U], p: &fn(t: T, u: &U) -> T) -> T {
1023
1023
* ~~~
1024
1024
*
1025
1025
*/
1026
- pub fn foldr<T, U: Copy>(v: &[T], z: U, p: &fn(t: &T, u: U) -> U) -> U {
1027
- let mut accum = z;
1028
- for v.each_reverse |elt| {
1029
- accum = p(elt, accum);
1026
+ pub fn foldr<'a, T, U>(v: &'a [T], mut z: U, p: &fn(t: &'a T, u: U) -> U) -> U {
1027
+ let mut i = v.len();
1028
+ while i > 0 {
1029
+ i -= 1;
1030
+ z = p(&v[i], z);
1030
1031
}
1031
- accum
1032
+ return z;
1032
1033
}
1033
1034
1034
1035
/**
@@ -1848,7 +1849,7 @@ pub trait ImmutableVector<'self, T> {
1848
1849
fn last_opt ( & self ) -> Option < & ' self T > ;
1849
1850
fn each_reverse ( & self , blk : & fn ( & T ) -> bool ) ;
1850
1851
fn eachi_reverse ( & self , blk : & fn ( uint , & T ) -> bool ) ;
1851
- fn foldr < U : Copy > ( & self , z : U , p : & fn ( t : & T , u : U ) -> U ) -> U ;
1852
+ fn foldr < ' a , U > ( & ' a self , z : U , p : & fn ( t : & ' a T , u : U ) -> U ) -> U ;
1852
1853
fn map < U > ( & self , f : & fn ( t : & T ) -> U ) -> ~[ U ] ;
1853
1854
fn mapi < U > ( & self , f : & fn ( uint , t : & T ) -> U ) -> ~[ U ] ;
1854
1855
fn map_r < U > ( & self , f : & fn ( x : & T ) -> U ) -> ~[ U ] ;
@@ -1921,7 +1922,7 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
1921
1922
1922
1923
/// Reduce a vector from right to left
1923
1924
#[ inline]
1924
- fn foldr < U : Copy > ( & self , z : U , p : & fn ( t : & T , u : U ) -> U ) -> U {
1925
+ fn foldr < ' a , U > ( & ' a self , z : U , p : & fn ( t : & ' a T , u : U ) -> U ) -> U {
1925
1926
foldr ( * self , z, p)
1926
1927
}
1927
1928
0 commit comments