aboutsummaryrefslogtreecommitdiff
path: root/src/brussel.common/YCombinator.hpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2023-10-19 22:50:07 -0700
committerrtk0c <[email protected]>2025-08-16 11:31:16 -0700
commit297232d21594b138bb368a42b5b0d085ff9ed6aa (patch)
tree075d5407e1e12a9d35cbee6e4c20ad34e0765c42 /src/brussel.common/YCombinator.hpp
parentd5cd34ff69f7fd134d5450696f298af1a864afbc (diff)
The great renaming: switch to "module style"
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)...);
+ }
+};