LeechCraft 0.6.70-17335-ge406ffdcaf
Modular cross-platform feature rich live environment.
Loading...
Searching...
No Matches
monadplus.h
Go to the documentation of this file.
1/**********************************************************************
2 * LeechCraft - modular cross-platform feature rich internet client.
3 * Copyright (C) 2006-2014 Georg Rudoy
4 *
5 * Distributed under the Boost Software License, Version 1.0.
6 * (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7 **********************************************************************/
8
9#pragma once
10
11#include <numeric>
12#include <optional>
13
14namespace LC
15{
16namespace Util
17{
18 template<typename T, typename SFINAE = void>
20 {
21 using UndefinedTag = void;
22 };
23
24 namespace detail
25 {
26 template<typename T>
27 constexpr bool IsMonadPlusImpl (int, typename InstanceMonadPlus<T>::UndefinedTag* = nullptr)
28 {
29 return false;
30 }
31
32 template<typename T>
33 constexpr bool IsMonadPlusImpl (float)
34 {
35 return true;
36 }
37 }
38
39 template<typename T>
40 constexpr bool IsMonadPlus ()
41 {
43 }
44
45 template<typename MP>
46 MP Mzero ()
47 {
49 }
50
51 const struct
52 {
53 template<typename MP>
54 auto operator() (const MP& m1) const
55 {
56 return [m1] (const MP& m2) { return InstanceMonadPlus<MP>::Mplus (m1, m2); };
57 }
58 } Mplus {};
59
60 template<typename MP>
61 auto operator+ (const MP& m1, const MP& m2) -> decltype (Mplus (m1) (m2))
62 {
63 return Mplus (m1) (m2);
64 }
65
66 const struct
67 {
68 template<typename Vec>
69 auto operator() (Vec&& vec) const
70 {
71 using std::begin;
72 using std::end;
73 using MP = typename Vec::value_type;
74 return std::accumulate (begin (vec), end (vec), Mzero<MP> (), &operator+<MP>);
75 }
76
77 template<typename T>
78 auto operator() (std::initializer_list<T> vec) const
79 {
80 using std::begin;
81 using std::end;
82 return std::accumulate (begin (vec), end (vec), Mzero<T> (), &operator+<T>);
83 }
84 } Msum {};
85
86 template<typename T>
87 struct InstanceMonadPlus<std::optional<T>>
88 {
89 static std::optional<T> Mzero ()
90 {
91 return {};
92 }
93
94 static std::optional<T> Mplus (const std::optional<T>& t1, const std::optional<T>& t2)
95 {
96 return t1 ? t1 : t2;
97 }
98 };
99}
100}
constexpr bool IsMonadPlusImpl(int, typename InstanceMonadPlus< T >::UndefinedTag *=nullptr)
Definition monadplus.h:27
constexpr bool IsMonadPlus()
Definition monadplus.h:40
const struct LC::Util::@125134063015056240220171211145124253256163227167 Msum
MP Mzero()
Definition monadplus.h:46
const struct LC::Util::@360365370133164236156306377114265336134342044043 Mplus
constexpr auto operator+(RawStr< N1, Char > s1, CtString< N2, Char > s2) noexcept
Definition ctstring.h:145
Definition constants.h:15
static std::optional< T > Mplus(const std::optional< T > &t1, const std::optional< T > &t2)
Definition monadplus.h:94