16 concept monad_state =
requires {
29 constexpr auto operator()(Fn&& fn)
const noexcept(
41 constexpr auto operator*()
const noexcept(
51 constexpr auto operator()(S&& s)
const noexcept(
58 inline namespace cpo {
92 constexpr auto operator()(T&& t)
const noexcept(
93 noexcept( std::make_pair(t, t)))
94 ->
decltype(std::make_pair(t, t)) {
96 return std::make_pair(std::forward<T>(t), std::move(t2));
100 constexpr auto operator()() const noexcept(
102 ->
decltype(mpc::state<ST>(closure{})) {
103 return mpc::state<ST>(closure{});
112 template <
class T,
class A>
113 constexpr auto operator()(T&& t, A&&)
const noexcept(
114 noexcept( std::make_pair(
unit, std::forward<T>(t))))
115 ->
decltype(std::make_pair(
unit, std::forward<T>(t))) {
116 return std::make_pair(
unit, std::forward<T>(t));
121 constexpr auto operator()(T&& t)
const noexcept(
122 noexcept( mpc::state<ST>(
partial(
closure{}, std::forward<T>(t)))))
123 ->
decltype(mpc::state<ST>(
partial(closure{}, std::forward<T>(t)))) {
124 return mpc::state<ST>(
partial(closure{}, std::forward<T>(t)));
136 monad_state_traits<std::remove_cvref_t<ST>>
::state;
159 template <
class Fn,
class T>
160 constexpr auto operator()(Fn&& f, T&& t)
const noexcept(
161 noexcept( std::make_pair(
unit, std::invoke(std::forward<Fn>(f), std::forward<T>(t)))))
162 ->
decltype(std::make_pair(
unit, std::invoke(std::forward<Fn>(f), std::forward<T>(t)))) {
163 return std::make_pair(
unit, std::invoke(std::forward<Fn>(f), std::forward<T>(t)));
168 constexpr auto operator()(Fn&& f)
const noexcept(
169 noexcept( mpc::state<ST>(
partial(
closure{}, std::forward<Fn>(f)))))
170 ->
decltype(mpc::state<ST>(
partial(closure{}, std::forward<Fn>(f)))) {
171 return mpc::state<ST>(
partial(closure{}, std::forward<Fn>(f)));
179 template <
class Fn,
class T>
180 constexpr auto operator()(Fn&& f, T&& t)
const noexcept(
181 noexcept( std::make_pair(std::invoke(std::forward<Fn>(f), t), t)))
182 ->
decltype(std::make_pair(std::invoke(std::forward<Fn>(f), t), t)) {
184 return std::make_pair(std::invoke(std::forward<Fn>(f), std::forward<T>(t)), std::move(t2));
189 constexpr auto operator()(Fn&& f)
const noexcept(
190 noexcept( mpc::state<ST>(
partial(
closure{}, std::forward<Fn>(f)))))
191 ->
decltype(mpc::state<ST>(
partial(closure{}, std::forward<Fn>(f)))) {
192 return mpc::state<ST>(
partial(closure{}, std::forward<Fn>(f)));
197 inline namespace cpo {
constexpr partial< detail::modify_op< std::remove_cvref_t< ST > > > modify
modify :: MonadState s m => (s -> s) -> m ()
Definition: class.hpp:200
constexpr partial< detail::getss_op< std::remove_cvref_t< ST > > > getss
getss :: MonadState s m => (s -> a) -> m a
Definition: class.hpp:204
constexpr partial< detail::put_op< ST > > put
put :: s -> m ()
Definition: class.hpp:69
constexpr detail::gets_op< ST > gets
gets :: m s
Definition: class.hpp:65
constexpr partial< detail::state_op< ST > > state
state :: (s -> (a, s)) -> m a
Definition: class.hpp:61
gets :: m s
Definition: class.hpp:40
Definition: class.hpp:178
getss :: MonadState s m => (s -> a) -> m a
Definition: class.hpp:177
Definition: class.hpp:158
modify :: MonadState s m => (s -> s) -> m ()
Definition: class.hpp:157
put :: s -> m ()
Definition: class.hpp:49
state :: (s -> (a, s)) -> m a
Definition: class.hpp:27
Implements a perfect-forwarding call wrapper.
Definition: partial.hpp:63
Definition: class.hpp:111
Definition: class.hpp:110
constexpr unit_t unit
An entity of an empty tuple.
Definition: unit.hpp:10