diff --git a/.common/cpp/skeleton.cpp b/.common/cpp/skeleton.cpp index da8fc11..cfea8de 100644 --- a/.common/cpp/skeleton.cpp +++ b/.common/cpp/skeleton.cpp @@ -93,6 +93,25 @@ std::vector load_vector(std::size_t size) { } #pragma endregion /* input */ +#pragma region functional +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0200r0.html +template +class y_combinator_result { + Fun fun_; + + public: + template + explicit y_combinator_result(T &&fun) : fun_(std::forward(fun)) {} + template + decltype(auto) operator()(Args &&...args) { + return fun_(std::ref(*this), std::forward(args)...); + } +}; +template +decltype(auto) y_combinator(Fun &&fun) { + return y_combinator_result>(std::forward(fun)); +} +#pragma endregion /* functional */ #define LOOP(var, n) for (auto var = 0; var < n; ++var)