33 #include <boost/optional.hpp> 39 template<
typename T,
typename SFINAE =
void>
63 return detail::IsMonadPlusImpl<T> (0);
75 auto operator() (
const MP& m1)
const 84 return Mplus (m1) (m2);
89 template<
typename Vec>
90 auto operator() (Vec&& vec)
const 94 using MP =
typename Vec::value_type;
95 return std::accumulate (begin (vec), end (vec), Mzero<MP> (), &
operator+<MP>);
99 auto operator() (
const std::initializer_list<T>& vec)
const 103 return std::accumulate (begin (vec), end (vec), Mzero<T> (), &
operator+<T>);
115 static boost::optional<T>
Mplus (
const boost::optional<T>& t1,
const boost::optional<T>& t2)
static boost::optional< T > Mplus(const boost::optional< T > &t1, const boost::optional< T > &t2)
constexpr bool IsMonadPlus()
auto operator+(const MP &m1, const MP &m2) -> decltype(Mplus(m1)(m2))
const struct LeechCraft::Util::@2 Msum
constexpr bool IsMonadPlusImpl(int, typename InstanceMonadPlus< T >::UndefinedTag *=nullptr)
static boost::optional< T > Mzero()
const struct LeechCraft::Util::@1 Mplus