From b8e79c09f61556c5f3efea9fc99904f7b409557f Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Sat, 29 Jul 2023 16:01:32 +0200 Subject: [PATCH] chore(cpp): add Y-combinator Signed-off-by: Matej Focko --- .common/cpp/skeleton.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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)