#include <iostream>
#include <future>
#include <numeric>
#include <vector>
#include <list>

template <typename It, typename Func>
void map(It first, It last, Func f)
{
	while (first != last)
	{
		f(*first++);
	}
}

template <typename It, typename MapFunc, typename FoldFunc>
auto map_reduce(It first, It last, MapFunc f1, FoldFunc f2, size_t num_threads)
	-> decltype(f2(f1(*first), f1(*first)))
{
	size_t block_size = std::distance(first, last) / num_threads;

	std::vector<std::future<int>> results(num_threads);
	for (size_t i = 0; i < num_threads; ++i)
	{
		results[i] = std::async(map, first, last, f1);
	}

	return 0;
}


int main()
{
	std::list<int> ls = { 1, 2, 3 };
	auto sum = map_reduce(ls.begin(), ls.end(),
		[](int i) {return i; },
		std::plus<int>(),
		3);

	return 0;
}