@@ -991,7 +991,7 @@ pub fn connect<T:Copy>(v: &[~[T]], sep: &T) -> ~[T] {
991991 * ~~~
992992 *
993993 */
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 {
995995 let mut accum = z;
996996 let mut i = 0;
997997 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 {
10231023 * ~~~
10241024 *
10251025 */
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);
10301031 }
1031- accum
1032+ return z;
10321033}
10331034
10341035/**
@@ -1848,7 +1849,7 @@ pub trait ImmutableVector<'self, T> {
18481849 fn last_opt ( & self ) -> Option < & ' self T > ;
18491850 fn each_reverse ( & self , blk : & fn ( & T ) -> bool ) ;
18501851 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 ;
18521853 fn map < U > ( & self , f : & fn ( t : & T ) -> U ) -> ~[ U ] ;
18531854 fn mapi < U > ( & self , f : & fn ( uint , t : & T ) -> U ) -> ~[ U ] ;
18541855 fn map_r < U > ( & self , f : & fn ( x : & T ) -> U ) -> ~[ U ] ;
@@ -1921,7 +1922,7 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
19211922
19221923 /// Reduce a vector from right to left
19231924 #[ 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 {
19251926 foldr ( * self , z, p)
19261927 }
19271928
0 commit comments