mpc
Haskell-like feature supports in C++
class.hpp
Go to the documentation of this file.
1
2
#pragma once
3
#include <
mpc/functional/partial.hpp
>
4
5
namespace
mpc {
6
// monad_trans
7
// https://hackage.haskell.org/package/transformers-0.6.0.2/docs/Control-Monad-Trans-Class.html
8
10
template
<
class
>
11
struct
monad_trans_traits
;
12
13
template
<
class
TR>
14
concept
monad_trans =
requires
{
15
monad_trans_traits<std::remove_cvref_t<TR>
>
::lift
;
16
};
17
18
// Methods required for the class definition.
19
20
namespace
detail {
22
template
<
class
TR>
23
struct
lift_op
{
24
template
<
class
M>
25
constexpr
auto
operator()(M&& m)
const
noexcept
(
26
noexcept
(
monad_trans_traits<std::remove_cvref_t<TR>
>
::lift
(std::forward<M>(m))))
27
->
decltype
(
monad_trans_traits<std::remove_cvref_t<TR>
>
::lift
(std::forward<M>(m)))
28
{
return
monad_trans_traits<std::remove_cvref_t<TR>
>
::lift
(std::forward<M>(m)); }
29
};
30
}
// namespace detail
31
32
inline
namespace
cpo {
34
template
<
class
TR>
35
inline
constexpr
partial<detail::lift_op<TR>
>
lift
{};
36
}
// namespace cpo
37
}
// namespace mpc
mpc::cpo::lift
constexpr partial< detail::lift_op< TR > > lift
lift :: (Monad m) => m a -> t m a
Definition:
class.hpp:35
partial.hpp
mpc::detail::lift_op
lift :: (Monad m) => m a -> t m a
Definition:
class.hpp:23
mpc::monad_trans_traits
class (forall m. Monad m => Monad (t m)) => MonadTrans t where
Definition:
class.hpp:11
mpc::partial
Implements a perfect-forwarding call wrapper.
Definition:
partial.hpp:63
include
mpc
control
trans
class.hpp
Generated by
1.9.2