Iros
 
Loading...
Searching...
No Matches
ycombinator.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/meta/util.h"
7#include "di/types/prelude.h"
8#include "di/util/forward.h"
9#include "di/util/move.h"
10
11namespace di::function {
12namespace detail {
13 template<typename F>
14 requires(concepts::ConstructibleFrom<meta::Decay<F>, F>)
15 struct YCombinator : pipeline::EnablePipeline {
16 public:
17 template<typename Fn>
18 constexpr YCombinator(InPlace, Fn&& function) : m_function(util::forward<Fn>(function)) {}
19
20 YCombinator(YCombinator const&) = default;
22
23 auto operator=(YCombinator const&) -> YCombinator& = delete;
24 auto operator=(YCombinator&&) -> YCombinator& = delete;
25
26 template<typename... Args>
27 requires(concepts::Invocable<F&, YCombinator&, Args...>)
28 constexpr auto operator()(Args&&... args) & -> decltype(auto) {
29 return function::invoke(m_function, *this, util::forward<Args>(args)...);
30 }
31
32 template<typename... Args>
33 requires(concepts::Invocable<F const&, YCombinator const&, Args...>)
34 constexpr auto operator()(Args&&... args) const& -> decltype(auto) {
35 return function::invoke(m_function, *this, util::forward<Args>(args)...);
36 }
37
38 template<typename... Args>
39 requires(concepts::Invocable<F &&, YCombinator &&, Args...>)
40 constexpr auto operator()(Args&&... args) && -> decltype(auto) {
41 return function::invoke(util::move(m_function), util::move(*this), util::forward<Args>(args)...);
42 }
43
44 template<typename... Args>
45 requires(concepts::Invocable<F const &&, YCombinator const &&, Args...>)
46 constexpr auto operator()(Args&&... args) const&& -> decltype(auto) {
47 return function::invoke(util::move(m_function), util::move(*this), util::forward<Args>(args)...);
48 }
49
50 private:
51 F m_function;
52 };
53
55 template<typename F>
57 constexpr auto operator()(F&& function) const {
58 return YCombinator<F>(in_place, util::forward<F>(function));
59 }
60 };
61}
62
63constexpr inline auto ycombinator = detail::YCombinatorFunction {};
64}
65
66namespace di {
68}
Definition operations.h:11
Definition invoke.h:58
concept F
Definition zip_transform.h:12
Definition bind_back.h:16
Definition pipeable.h:7
Definition as_bool.h:8
constexpr auto invoke
Definition invoke.h:100
constexpr auto ycombinator
Definition ycombinator.h:63
Definition vocab.h:96
Definition zstring_parser.h:9
constexpr auto in_place
Definition in_place.h:8
Definition ycombinator.h:15
YCombinator(YCombinator &&)=default
constexpr YCombinator(InPlace, Fn &&function)
Definition ycombinator.h:18
auto operator=(YCombinator const &) -> YCombinator &=delete
YCombinator(YCombinator const &)=default
auto operator=(YCombinator &&) -> YCombinator &=delete
Definition in_place.h:4