From d96c419b14e21b5a1444ea6122659bc8966a8b1c Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 27 Oct 2011 21:34:16 -0700 Subject: [PATCH] Add std::vec::foldr --- src/lib/vec.rs | 15 ++++++++++++++- src/test/stdtest/vec.rs | 10 ++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/lib/vec.rs b/src/lib/vec.rs index 7ef0f525d74..a378b8ff2d4 100644 --- a/src/lib/vec.rs +++ b/src/lib/vec.rs @@ -435,7 +435,7 @@ Function: foldl Reduce a vector from left to right */ -fn foldl(p: block(U, T) -> U, z: U, v: [mutable? T]) -> U { +fn foldl(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(p: block(U, T) -> U, z: U, v: [mutable? T]) -> U { ret accum; } +/* +Function: foldr + +Reduce a vector from right to left +*/ +fn foldr(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 diff --git a/src/test/stdtest/vec.rs b/src/test/stdtest/vec.rs index 50c02a96033..01b0e14f7cc 100644 --- a/src/test/stdtest/vec.rs +++ b/src/test/stdtest/vec.rs @@ -302,6 +302,16 @@ fn test_foldl2() { 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;