1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "function_example1.h"
6 
7 #include <vector>
8 
9 #include <lib/fit/function.h>
10 
11 // This example demonstrates using fit::function to implement a higher order
12 // function called a left-fold.  |fold()| recursively combines elements in a
13 // vector.
14 namespace function_example1 {
15 
16 using fold_function = fit::function<int(int value, int item)>;
17 
fold(const std::vector<int> & in,int value,const fold_function & f)18 int fold(const std::vector<int>& in, int value, const fold_function& f) {
19     for (auto& item : in) {
20         value = f(value, item);
21     }
22     return value;
23 }
24 
sum_item(int value,int item)25 int sum_item(int value, int item) {
26     return value + item;
27 }
28 
sum(const std::vector<int> & in)29 int sum(const std::vector<int>& in) {
30     // bind to a function pointer
31     fold_function fn(&sum_item);
32     return fold(in, 0, fn);
33 }
34 
alternating_sum(const std::vector<int> & in)35 int alternating_sum(const std::vector<int>& in) {
36     // bind to a lambda
37     int sign = 1;
38     fold_function fn([&sign](int value, int item) {
39         value += sign * item;
40         sign *= -1;
41         return value;
42     });
43     return fold(in, 0, fn);
44 }
45 
run()46 void run() {
47     std::vector<int> in;
48     for (int i = 0; i < 10; i++) {
49         in.push_back(i);
50     }
51     assert(sum(in) == 45);
52     assert(alternating_sum(in) == -5);
53 }
54 
55 } // namespace function_example1
56