diff --git a/header/vectors.h b/header/vectors.h index fdef828975bd4c58ec6ac706537de5f1ab2269aa..0c4c5949fcab158536606447cda803dfdfb07e44 100644 --- a/header/vectors.h +++ b/header/vectors.h @@ -32,5 +32,6 @@ void vector_free(vector vec); void vector_print(vector vec, void (*print)(type)); vector vector_map(vector vec, type (*f)(type)); vector vector_filter(vector vec, bool (*f)(type)); +type vector_reduce(vector vec, type neutral, type (*f)(type, type)); #endif \ No newline at end of file diff --git a/src/test_vectors.c b/src/test_vectors.c index bda3a8743aa5897026384d706920d02fc5a1c8c2..40fb57b7d665b65f2ab01aaaeb660280dcbfbc66 100644 --- a/src/test_vectors.c +++ b/src/test_vectors.c @@ -13,6 +13,7 @@ void print_type(type val); int times_two(type a); bool lower_than_five(type a); +type add(type lhs, type rhs); int main() { @@ -71,6 +72,11 @@ int main() vector_print(test_3, &print_type); printf("\n"); + //Test Vector Reduce + type sum = vector_reduce(test_3, 0, add); + print_type(sum); + printf("\n"); + //Test Vector Free vector_free(test); vector_free(test_2); @@ -92,4 +98,9 @@ int times_two(type a) bool lower_than_five(type a) { return (a < 5); +} + +type add(type lhs, type rhs) +{ + return lhs + rhs; } \ No newline at end of file diff --git a/src/vectors.c b/src/vectors.c index 83a7159a73ff9e87fb2f8d6a8cac77ec7b83fa6c..79fef3aea7196e841f79e32a0e3d17a83499939e 100644 --- a/src/vectors.c +++ b/src/vectors.c @@ -158,4 +158,13 @@ vector vector_filter(vector vec, bool (*f)(type)) } } return new_vec; +} + +type vector_reduce(vector vec, type neutral, type (*f)(type, type)) +{ + for (int i = 0; i < vec->length; i++) + { + neutral = f(neutral, vec->content[i]); + } + return neutral; } \ No newline at end of file