Skip to content

Commit 19d2ba3

Browse files
committed
auto merge of #6254 : alexcrichton/rust/issues-5311-4490-better-foldl, r=graydon
Closes #5311 and #4490. This doesn't change `vec.foldl` because that's still part of `old_iter`, although I could change that as well if necessary.
2 parents 7b3e036 + 44c1e46 commit 19d2ba3

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

src/libcore/vec.rs

+9-8
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
/**
@@ -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

Comments
 (0)