8 #ifndef _SIG_UTIL_MAYBE_HPP
9 #define _SIG_UTIL_MAYBE_HPP
11 #include "../sigutil.hpp"
16 #if SIG_ENABLE_BOOST && SIG_USE_OPTIONAL
17 #include <boost/optional.hpp>
44 #if SIG_ENABLE_BOOST && SIG_USE_OPTIONAL
45 template <
class T>
using Maybe = boost::optional<T>;
54 template <class T, class R = typename sig::impl::remove_const_reference<T>::type>
66 template <
class T =
void>
84 template <
class T>
bool isJust(
Maybe<T> const& m){
return static_cast<bool>(m); }
85 constexpr
bool isJust(boost::none_t m){
return false; }
90 constexpr
bool isNothing(boost::none_t m){
return true; }
147 template <
class T> T&&
fromMaybe(T&& def,
Maybe<T>&& m){
return m ? std::move(*m) : std::move(def); }
148 template <
class T> T&&
fromMaybe(T&& def, boost::none_t m){
return std::move(def); }
168 template <
class F,
class C>
auto mapMaybe(F
const& f, C
const& list)
170 typename std::remove_reference<decltype(*(
impl::eval(
176 using R =
typename impl::container_traits<C>::template rebind<typename std::remove_reference<decltype(*(impl::eval(f, std::declval<typename impl::container_traits<C>::value_type>())))>::type>;
180 for (
auto const& e : list){
211 template <
class T,
class F>
215 else return boost::none;
240 template <
class F,
class T>
241 auto operator<<=(F const& f, Maybe<T>
const& m) ->decltype(
impl::eval(f, std::declval<T>()))
244 else return boost::none;
272 template <
class T1,
class T2>
273 auto operator<<=(Maybe<T1>& m, T2
const& v) ->
Maybe<T1>&
284 template <
class I,
class D =
void>
using Maybe = std::tuple<I, bool>;
286 template <
class I> Maybe<I>
Just(I v){
return std::make_tuple(v,
true); }
288 template <
class I> Maybe<I>
Nothing(I&& dummy){
return std::make_tuple(dummy,
false); }
289 template <
class I> Maybe<I>
Nothing(I
const& dummy){
return std::make_tuple(dummy,
false); }
291 template <
class I>
bool isJust(Maybe<I>
const& m){
return std::get<1>(m); }
293 template <
class I>
bool isNothing(Maybe<I>
const& m){
return !std::get<1>(m); }
295 template <
class T> T&
fromJust(Maybe<T>& m){
return *m; }
296 template <
class T> T
const&
fromJust(Maybe<T>
const& m){
return *m; }
297 template <
class T> T&&
fromJust(Maybe<T>&& m){
return *std::move(m); }
299 template <
class T> T&
operator*(Maybe<T>& m){
300 if (!std::get<1>(m)) std::abort();
301 return std::get<0>(m);
303 template <
class T> T
const&
operator*(Maybe<T>
const& m){
304 if (!std::get<1>(m)) std::abort();
305 return std::get<0>(m);
307 template <
class T> T&&
operator*(Maybe<T>&& m){
308 if (!std::get<1>(m)) std::abort();
309 return std::move(std::get<0>(m));
313 template <
class T1,
class T2>
314 auto operator<<=(Maybe<T1>& m, T2
const& v) ->Maybe<T1>&
317 std::get<1>(m) =
true;
auto operator*(T1 &&v1, T2 &&v2) -> decltype(binary_operation(mult_t(), std::forward< T1 >(v1), std::forward< T2 >(v2)))
auto mapMaybe(F const &f, C const &list) -> typename impl::container_traits< C >::template rebind< typename std::remove_reference< decltype(*(impl::eval(f, std::declval< typename impl::container_traits< C >::value_type >())))>::type >
Maybeを返す関数を指定するfilter関数.(a -> Maybe b) -> [a] -> [b].
auto operator>>=(Maybe< T > const &m, F const &f) -> decltype(impl::eval(f, std::declval< T >()))
Haskell風のbind演算子. Maybe m => m a -> (a -> m b) -> m b.
bool isNothing(Maybe< T > const &m)
Nothingであるか調べる関数.Maybe a -> Bool.
T & fromMaybe(T &def, Maybe< T > &m)
Maybeから値を取り出す関数.もしNothingなら引数のデフォルト値を返す.a -> Maybe a -> a...
auto Nothing() -> typename impl::SameIf< T, void, typename boost::none_t, Maybe< T >>::type
値コンストラクタ
Maybe< R > Just(T &&v)
値コンストラクタ
bool isJust(Maybe< T > const &m)
Justであるか調べる関数.Maybe a -> Bool.
boost::optional< T > Maybe
auto eval(F &&f, Args &&...args) -> decltype(f(std::forward< Args >(args)...))
T & fromJust(Maybe< T > &m)
Justから値を取り出す関数.Maybe a -> a.