aboutsummaryrefslogtreecommitdiff
path: root/source/YCombinator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/YCombinator.hpp')
-rw-r--r--source/YCombinator.hpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/source/YCombinator.hpp b/source/YCombinator.hpp
new file mode 100644
index 0000000..b1d2350
--- /dev/null
+++ b/source/YCombinator.hpp
@@ -0,0 +1,14 @@
+#pragma once
+
+template <class Func>
+struct YCombinator {
+ // NOTE: implicit constructor allows initializing this
+ Func func;
+
+ template <class... Ts>
+ decltype(auto) operator()(Ts&&... args) const {
+ // NOTE: static_cast<Ts>(args)... is equivalent to std::forward<Ts>(args)...
+ // written this way so that we don't have to include <utility>, as well as reducing template instanciations to help compile time
+ return func(*this, static_cast<Ts>(args)...);
+ }
+};