33 #include <boost/optional.hpp>
39 template<
typename Applicative>
40 struct InstanceApplicative;
42 template<
typename AF,
typename AV>
43 using GSLResult_t =
typename InstanceApplicative<AF>::template GSLResult<AV>::Type_t;
45 template<
template<
typename...>
class Applicative,
typename... Args,
typename T>
46 auto Pure (
const T& v)
48 return InstanceApplicative<Applicative<Args..., T>>
::Pure (v);
51 template<
typename Applicative,
typename T>
57 template<
typename AF,
typename AV>
58 GSLResult_t<AF, AV>
GSL (
const AF& af,
const AV& av)
63 template<
typename AF,
typename AV>
64 auto operator* (
const AF& af,
const AV& av) -> decltype (
GSL (af, av))
71 struct InstanceApplicative<
boost::optional<T>>
73 using Type_t = boost::optional<T>;
79 struct GSLResult<
boost::optional<V>>
81 using Type_t = boost::optional<std::result_of_t<T (
const V&)>>;
85 static boost::optional<U>
Pure (
const U& v)
101 struct InstanceApplicative<std::optional<T>>
103 using Type_t = std::optional<T>;
109 struct GSLResult<std::optional<V>>
111 using Type_t = std::optional<std::result_of_t<T (
const V&)>>;
115 static std::optional<U>
Pure (
const U& v)
120 template<
typename AV>
121 static GSLResult_t<Type_t, AV>
GSL (
const Type_t&
f,
const AV& v)
126 return { (*f) (*v) };