]> git.lizzy.rs Git - rust.git/commitdiff
Add std::vec::foldr
authorBrian Anderson <banderson@mozilla.com>
Fri, 28 Oct 2011 04:34:16 +0000 (21:34 -0700)
committerBrian Anderson <banderson@mozilla.com>
Fri, 28 Oct 2011 04:34:16 +0000 (21:34 -0700)
src/lib/vec.rs
src/test/stdtest/vec.rs

index 7ef0f525d74f3480a5b3b0d87462983473a0878c..a378b8ff2d4e6d647646ea1268f87b0927695867 100644 (file)
@@ -435,7 +435,7 @@ fn filter<T>(f: block(T) -> bool, v: [mutable? T]) -> [T] {
 
 Reduce a vector from left to right
 */
-fn foldl<T, U>(p: block(U, T) -> U, z: U, v: [mutable? T]) -> U {
+fn foldl<T, U>(p: block(T, U) -> T, z: T, v: [mutable? U]) -> T {
     let accum = z;
     iter(v) { |elt|
         accum = p(accum, elt);
@@ -443,6 +443,19 @@ fn foldl<T, U>(p: block(U, T) -> U, z: U, v: [mutable? T]) -> U {
     ret accum;
 }
 
+/*
+Function: foldr
+
+Reduce a vector from right to left
+*/
+fn foldr<T, U>(p: block(T, U) -> U, z: U, v: [mutable? T]) -> U {
+    let accum = z;
+    riter(v) { |elt|
+        accum = p(elt, accum);
+    }
+    ret accum;
+}
+
 /*
 Function: any
 
index 50c02a9603318417e7e283ea5bde1a348a2b49f3..01b0e14f7ccad5ec772473290eb931f4f704dece 100644 (file)
@@ -302,6 +302,16 @@ fn sub(&&a: int, &&b: int) -> int {
     assert sum == -10;
 }
 
+#[test]
+fn test_foldr() {
+    fn sub(&&a: int, &&b: int) -> int {
+        a - b
+    }
+    let v = [1, 2, 3, 4];
+    let sum = vec::foldr(sub, 0, v);
+    assert sum == -2;
+}
+
 #[test]
 fn iter_empty() {
     let i = 0;