aboutsummaryrefslogtreecommitdiff
path: root/src/brussel.common/YCombinator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/brussel.common/YCombinator.hpp')
-rw-r--r--src/brussel.common/YCombinator.hpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/brussel.common/YCombinator.hpp b/src/brussel.common/YCombinator.hpp
new file mode 100644
index 0000000..2da06c8
--- /dev/null
+++ b/src/brussel.common/YCombinator.hpp
@@ -0,0 +1,14 @@
+#pragma once
+
+template <typename Func>
+struct YCombinator {
+ // NOTE: implicit constructor allows initializing this
+ Func func;
+
+ template <typename... 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)...);
+ }
+};