about summary refs log tree commit diff
path: root/src/lib
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-10-27 20:47:06 -0700
committerBrian Anderson <banderson@mozilla.com>2011-10-27 20:47:06 -0700
commit1a89e589a4c3d8c0119d81c45634dced10f1c541 (patch)
tree80685a269602f0802fffd3969ee53d65814c78ca /src/lib
parentb5ed1c46c0407c6a6c3354d1c8da8531d992064c (diff)
Implement vec::foldl without recursion
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/vec.rs12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/lib/vec.rs b/src/lib/vec.rs
index b7f441c321f..413d92f85bc 100644
--- a/src/lib/vec.rs
+++ b/src/lib/vec.rs
@@ -433,14 +433,14 @@ fn filter<T>(f: block(T) -> bool, v: [mutable? T]) -> [T] {
 /*
 Function: foldl
 
-FIXME: This looks like it's actually foldr
+Reduce a vector from left to right
 */
 fn foldl<T, U>(p: block(U, T) -> U, z: U, v: [mutable? T]) -> U {
-    let sz = len(v);
-    if sz == 0u { ret z; }
-    let first = v[0];
-    let rest = slice(v, 1u, sz);
-    ret p(foldl(p, z, rest), first);
+    let accum = z;
+    iter(v) { |elt|
+        accum = p(accum, elt);
+    }
+    ret accum;
 }
 
 /*