#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
template <typename F, typename... Fs>
auto lambdaList(F f, Fs... fs)
{
return [=] (auto&... args) { f(args...); lambdaList(fs...)(args...); };
}
template <typename F>
auto lambdaList(F f)
{
return [=] (auto&... args) { f(args...); };
}
struct Window
{
Window (int, int, int, int) {}
};
int main()
{
auto printStarBefore = [] (const std::string& str) {
std::cout << "* " + str;
};
auto printStarAfter = [] (const std::string& str) {
std::cout << str + " *" << std::endl;
};
auto colorBG = [] (const Window&) {
std::cout << "BG set ";
};
auto colorFG = [] (const Window&) {
std::cout << "FG set\n";
};
auto composed = lambdaList(printStarBefore,printStarAfter);
std::vector<std::string> vec = {"1","2","3","4"};
std::for_each(std::begin(vec), std::end(vec), composed);
auto composed2 = lambdaList(colorBG, colorFG);
Window win(2,25,5,0);
composed2(win);
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEYsIHR5cGVuYW1lLi4uIEZzPgphdXRvIGxhbWJkYUxpc3QoRiBmLCBGcy4uLiBmcykKewogICAgcmV0dXJuIFs9XSAoYXV0byYuLi4gYXJncykgeyBmKGFyZ3MuLi4pOyBsYW1iZGFMaXN0KGZzLi4uKShhcmdzLi4uKTsgfTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEY+CmF1dG8gbGFtYmRhTGlzdChGIGYpCnsKICAgIHJldHVybiBbPV0gKGF1dG8mLi4uIGFyZ3MpIHsgZihhcmdzLi4uKTsgfTsKfQoKc3RydWN0IFdpbmRvdwp7CiAgICBXaW5kb3cgKGludCwgaW50LCBpbnQsIGludCkge30KfTsKCmludCBtYWluKCkKewogICAgYXV0byBwcmludFN0YXJCZWZvcmUgPSBbXSAoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewogICAgICAgIHN0ZDo6Y291dCA8PCAiKiAiICsgc3RyOwogICAgfTsKICAgIGF1dG8gcHJpbnRTdGFyQWZ0ZXIgPSBbXSAoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewogICAgICAgIHN0ZDo6Y291dCA8PCBzdHIgKyAiICoiIDw8IHN0ZDo6ZW5kbDsKICAgIH07CgogICAgYXV0byBjb2xvckJHID0gW10gKGNvbnN0IFdpbmRvdyYpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkJHIHNldCAiOwogICAgfTsKCiAgICBhdXRvIGNvbG9yRkcgPSBbXSAoY29uc3QgV2luZG93JikgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRkcgc2V0XG4iOwogICAgfTsKCiAgICBhdXRvIGNvbXBvc2VkID0gbGFtYmRhTGlzdChwcmludFN0YXJCZWZvcmUscHJpbnRTdGFyQWZ0ZXIpOwogICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZlYyA9IHsiMSIsIjIiLCIzIiwiNCJ9OwogICAgc3RkOjpmb3JfZWFjaChzdGQ6OmJlZ2luKHZlYyksIHN0ZDo6ZW5kKHZlYyksIGNvbXBvc2VkKTsKCiAgICBhdXRvIGNvbXBvc2VkMiA9IGxhbWJkYUxpc3QoY29sb3JCRywgY29sb3JGRyk7CiAgICBXaW5kb3cgd2luKDIsMjUsNSwwKTsKICAgIGNvbXBvc2VkMih3aW4pOwp9Cg==