Skip to content

Commit 44c1e46

Browse files
committed
Improve lifetimes on foldl/foldr and lift the Copy requirement
1 parent 6e6a4be commit 44c1e46

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

src/libcore/vec.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
/**
@@ -1851,7 +1852,7 @@ pub trait ImmutableVector<'self, T> {
18511852
fn last_opt(&self) -> Option<&'self T>;
18521853
fn each_reverse(&self, blk: &fn(&T) -> bool);
18531854
fn eachi_reverse(&self, blk: &fn(uint, &T) -> bool);
1854-
fn foldr<U: Copy>(&self, z: U, p: &fn(t: &T, u: U) -> U) -> U;
1855+
fn foldr<'a, U>(&'a self, z: U, p: &fn(t: &'a T, u: U) -> U) -> U;
18551856
fn map<U>(&self, f: &fn(t: &T) -> U) -> ~[U];
18561857
fn mapi<U>(&self, f: &fn(uint, t: &T) -> U) -> ~[U];
18571858
fn map_r<U>(&self, f: &fn(x: &T) -> U) -> ~[U];
@@ -1924,7 +1925,7 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
19241925

19251926
/// Reduce a vector from right to left
19261927
#[inline]
1927-
fn foldr<U:Copy>(&self, z: U, p: &fn(t: &T, u: U) -> U) -> U {
1928+
fn foldr<'a, U>(&'a self, z: U, p: &fn(t: &'a T, u: U) -> U) -> U {
19281929
foldr(*self, z, p)
19291930
}
19301931

0 commit comments

Comments
 (0)