18 template<
typename Applicative>
19 struct InstanceApplicative;
21 template<
typename AF,
typename AV>
22 using GSLResult_t =
typename InstanceApplicative<AF>::template GSLResult<AV>::Type_t;
24 template<
template<
typename...>
class Applicative,
typename... Args,
typename T>
25 auto Pure (
const T& v)
27 return InstanceApplicative<Applicative<Args..., T>>
::Pure (v);
30 template<
typename Applicative,
typename T>
36 template<
typename AF,
typename AV>
42 template<
typename AF,
typename AV>
43 auto operator* (
const AF& af,
const AV& av) -> decltype (
GSL (af, av))
53 using Type_t = std::optional<T>;
59 struct GSLResult<std::optional<V>>
61 using Type_t = std::optional<std::result_of_t<T (
const V&)>>;
65 static std::optional<U>
Pure (
const U& v)
80 template<
typename L,
typename R>
81 struct InstanceApplicative<Either<L, R>>
89 struct GSLResult<
Either<L, V>>
91 using Type_t =
Either<L, std::result_of_t<R (
const V&)>>;
100 template<
typename AV>
106 return R_t::Left (
f.GetLeft ());
109 return R_t::Left (v.GetLeft ());
111 return R_t::Right (
f.GetRight () (v.GetRight ()));