Iros
 
Loading...
Searching...
No Matches
monad_interface.h
Go to the documentation of this file.
1#pragma once
2
9#include "di/meta/util.h"
10#include "di/util/forward.h"
11#include "di/util/move.h"
12
13namespace di::function::monad {
14template<typename Self>
16public:
17 template<typename F>
18 requires(concepts::Invocable<decltype(fmap), Self&, F>)
19 constexpr auto transform(F&& function) & -> decltype(auto) {
20 return fmap(static_cast<Self&>(*this), util::forward<F>(function));
21 }
22
23 template<typename F>
24 requires(concepts::Invocable<decltype(fmap), Self const&, F>)
25 constexpr auto transform(F&& function) const& -> decltype(auto) {
26 return fmap(static_cast<Self const&>(*this), util::forward<F>(function));
27 }
28
29 template<typename F>
30 requires(concepts::Invocable<decltype(fmap), Self &&, F>)
31 constexpr auto transform(F&& function) && -> decltype(auto) {
32 return fmap(static_cast<Self&&>(*this), util::forward<F>(function));
33 }
34
35 template<typename F>
36 requires(concepts::Invocable<decltype(fmap), Self const &&, F>)
37 constexpr auto transform(F&& function) const&& -> decltype(auto) {
38 return fmap(static_cast<Self const&&>(*this), util::forward<F>(function));
39 }
40
41 template<typename F>
42 requires(concepts::Invocable<decltype(bind), Self&, F>)
43 constexpr auto and_then(F&& function) & -> decltype(auto) {
44 return bind(static_cast<Self&>(*this), util::forward<F>(function));
45 }
46
47 template<typename F>
48 requires(concepts::Invocable<decltype(bind), Self const&, F>)
49 constexpr auto and_then(F&& function) const& -> decltype(auto) {
50 return bind(static_cast<Self const&>(*this), util::forward<F>(function));
51 }
52
53 template<typename F>
54 requires(concepts::Invocable<decltype(bind), Self &&, F>)
55 constexpr auto and_then(F&& function) && -> decltype(auto) {
56 return bind(static_cast<Self&&>(*this), util::forward<F>(function));
57 }
58
59 template<typename F>
60 requires(concepts::Invocable<decltype(bind), Self const &&, F>)
61 constexpr auto and_then(F&& function) const&& -> decltype(auto) {
62 return bind(static_cast<Self const&&>(*this), util::forward<F>(function));
63 }
64
65 template<typename F>
66 requires(concepts::Invocable<decltype(fail), Self&, F>)
67 constexpr auto or_else(F&& function) & -> decltype(auto) {
68 return fail(static_cast<Self&>(*this), util::forward<F>(function));
69 }
70
71 template<typename F>
72 requires(concepts::Invocable<decltype(fail), Self const&, F>)
73 constexpr auto or_else(F&& function) const& -> decltype(auto) {
74 return fail(static_cast<Self const&>(*this), util::forward<F>(function));
75 }
76
77 template<typename F>
78 requires(concepts::Invocable<decltype(fail), Self &&, F>)
79 constexpr auto or_else(F&& function) && -> decltype(auto) {
80 return fail(static_cast<Self&&>(*this), util::forward<F>(function));
81 }
82
83 template<typename F>
84 requires(concepts::Invocable<decltype(fail), Self const &&, F>)
85 constexpr auto or_else(F&& function) const&& -> decltype(auto) {
86 return fail(static_cast<Self const&&>(*this), util::forward<F>(function));
87 }
88
89 template<typename F>
90 requires(concepts::Invocable<decltype(fmap_right), Self&, F>)
91 constexpr auto transform_error(F&& function) & -> decltype(auto) {
92 return fmap_right(static_cast<Self&>(*this), util::forward<F>(function));
93 }
94
95 template<typename F>
96 requires(concepts::Invocable<decltype(fmap_right), Self const&, F>)
97 constexpr auto transform_error(F&& function) const& -> decltype(auto) {
98 return fmap_right(static_cast<Self const&>(*this), util::forward<F>(function));
99 }
100
101 template<typename F>
102 requires(concepts::Invocable<decltype(fmap_right), Self &&, F>)
103 constexpr auto transform_error(F&& function) && -> decltype(auto) {
104 return fmap_right(static_cast<Self&&>(*this), util::forward<F>(function));
105 }
106
107 template<typename F>
108 requires(concepts::Invocable<decltype(fmap_right), Self const &&, F>)
109 constexpr auto transform_error(F&& function) const&& -> decltype(auto) {
110 return fmap_right(static_cast<Self const&&>(*this), util::forward<F>(function));
111 }
112
113private:
114 constexpr friend auto tag_invoke(types::Tag<enable_monad>, types::InPlaceType<Self>) -> bool { return true; }
115};
116}
Definition monad_interface.h:15
constexpr auto and_then(F &&function) &&-> decltype(auto)
Definition monad_interface.h:55
constexpr auto and_then(F &&function) &-> decltype(auto)
Definition monad_interface.h:43
constexpr auto and_then(F &&function) const &&-> decltype(auto)
Definition monad_interface.h:61
constexpr friend auto tag_invoke(types::Tag< enable_monad >, types::InPlaceType< Self >) -> bool
Definition monad_interface.h:114
constexpr auto transform(F &&function) &-> decltype(auto)
Definition monad_interface.h:19
constexpr auto transform(F &&function) &&-> decltype(auto)
Definition monad_interface.h:31
constexpr auto or_else(F &&function) &&-> decltype(auto)
Definition monad_interface.h:79
constexpr auto transform_error(F &&function) const &-> decltype(auto)
Definition monad_interface.h:97
constexpr auto transform(F &&function) const &&-> decltype(auto)
Definition monad_interface.h:37
constexpr auto transform_error(F &&function) &&-> decltype(auto)
Definition monad_interface.h:103
constexpr auto transform(F &&function) const &-> decltype(auto)
Definition monad_interface.h:25
constexpr auto and_then(F &&function) const &-> decltype(auto)
Definition monad_interface.h:49
constexpr auto transform_error(F &&function) const &&-> decltype(auto)
Definition monad_interface.h:109
constexpr auto transform_error(F &&function) &-> decltype(auto)
Definition monad_interface.h:91
constexpr auto or_else(F &&function) &-> decltype(auto)
Definition monad_interface.h:67
constexpr auto or_else(F &&function) const &-> decltype(auto)
Definition monad_interface.h:73
constexpr auto or_else(F &&function) const &&-> decltype(auto)
Definition monad_interface.h:85
Definition invoke.h:58
Definition monad_bind.h:6
constexpr auto bind
Definition monad_bind.h:14
constexpr auto fmap
Definition monad_fmap.h:14
constexpr auto fmap_right
Definition monad_fmap_right.h:14
constexpr auto fail
Definition monad_fail.h:14
Definition as_bool.h:8
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition in_place_type.h:5