Maybe Result
 All Classes Functions
result.inline.hpp
1 /*
2  * Copyright 2016 TRAFI
3  *
4  * Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
5  * http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
6  * http://opensource.org/licenses/MIT>, at your option. This file may not be
7  * copied, modified, or distributed except according to those terms.
8  *
9  */
10 
11 #pragma once
12 
13 #include "result.hpp"
14 
15 template <typename T, typename E>
16 template <typename F, typename R>
17 inline auto maybe::result<T, E>::map(F f) noexcept -> maybe::result<R, E>
18 {
19  if (is_err()) {
20  return maybe::result<R, E>::err(std::forward<E>(err_value()));
21  }
22 
23  return maybe::result<R, E>(f(ok_value()), internal::placeholder{});
24 };
25 
26 template <typename T, typename E>
27 inline auto maybe::result<T, E>::map_void() noexcept -> maybe::result<void, E>
28 {
29  if (is_err()) {
30  return maybe::result<void, E>::err(std::forward<E>(err_value()));
31  }
32 
33  return maybe::result<void, E>();
34 };
35 
36 template <typename T, typename E>
37 template <typename U>
38 inline auto maybe::result<T, E>::map_value(U value) noexcept -> maybe::result<U, E>
39 {
40  if (is_err()) {
41  return maybe::result<U, E>::err(std::forward<E>(err_value()));
42  }
43 
44  return maybe::result<U, E>(std::forward<U>(value), internal::placeholder{});
45 };
46 
47 template <typename T, typename E>
48 template <typename F>
49 inline auto maybe::result<T, E>::map_err(F f) noexcept
51 {
53 
54  if (is_ok()) {
55  return return_result_t(std::forward<T>(ok_value()), internal::placeholder{});
56  }
57  return return_result_t(internal::placeholder{}, f(err_value()));
58 };
59 
60 template <typename T, typename E>
61 template <typename U>
63 {
64  if (is_ok()) {
65  return maybe::result<T, U>(std::forward<T>(ok_value()), internal::placeholder{});
66  }
67 
68  return maybe::result<T, U>::err(std::forward<U>(value));
69 };
70 
71 template <typename T, typename E>
72 template <typename F>
73 inline auto maybe::result<T, E>::and_then(F f) noexcept -> typename std::result_of<F(T)>::type
74 {
75  typedef typename std::result_of<F(T)>::type result_t;
76 
77  if (is_err()) {
78  return maybe::result<typename result_t::ok_type, E>::err(std::forward<E>(err_value()));
79  }
80  return f(ok_value());
81 };
82 
83 template <typename T, typename E>
84 template <typename U>
85 inline auto maybe::result<T, E>::into_err() noexcept -> maybe::result<U, E> const
86 {
87  if (is_err()) {
88  return maybe::result<U, E>(internal::placeholder{}, std::forward<E>(err_value()));
89  }
91 };
92 
93 template <typename E>
94 template <typename F>
95 inline auto maybe::result<void, E>::map(F f) noexcept
97 {
98  typedef maybe::result<typename std::result_of<F()>::type, E> return_result_t;
99 
100  if (is_err()) {
101  return return_result_t::err(std::forward<E>(err_value()));
102  }
103  return return_result_t(f(), internal::placeholder{});
104 };
105 
106 template <typename E>
107 template <typename U>
109 {
110  if (is_err()) {
111  return maybe::result<U, E>::err(std::forward<E>(err_value()));
112  }
113 
114  return maybe::result<U, E>(std::forward<U>(value), internal::placeholder{});
115 };
116 
117 template <typename E>
118 template <typename F>
119 inline auto maybe::result<void, E>::map_err(F f) noexcept
121 {
123 
124  if (is_ok()) {
125  return return_result_t::ok();
126  }
127  return return_result_t(internal::placeholder{}, f(err_value()));
128 };
129 
130 template <typename E>
131 template <typename U>
133 {
134  if (is_ok()) {
136  }
137 
138  return maybe::result<void, U>(std::forward<U>(value));
139 };
140 
141 template <typename E>
142 template <typename F>
143 inline auto maybe::result<void, E>::and_then(F f) noexcept -> typename std::result_of<F()>::type
144 {
145  typedef typename std::result_of<F()>::type result_t;
146 
147  if (is_err()) {
148  return maybe::result<typename result_t::ok_type, E>::err(std::forward<E>(err_value()));
149  }
150  return f();
151 };
152 
153 template <typename E>
154 inline auto maybe::result<void, E>::into_err() noexcept -> maybe::result<void, E>
155 {
156  if (is_err()) {
157  return maybe::result<void, E>(std::forward<E>(err_value()));
158  }
160 };
auto and_then(F op) noexcept-> typename std::result_of< F(T)>::type
auto map_void() noexcept-> maybe::result< void, E >
auto map_err_value(U value) noexcept-> maybe::result< T, U >
static constexpr result< T, E > ok(T &&value) noexcept
Definition: result.hpp:71
static constexpr result< T, E > default_ok() noexcept
Definition: result.hpp:104
auto into_err() noexcept-> maybe::result< U, E > const
auto map_err(F f) noexcept-> maybe::result< T, typename std::result_of< F(E)>::type >
static constexpr result< T, E > err(E &&value) noexcept
Definition: result.hpp:88
auto map(F f) noexcept-> maybe::result< R, E >
bool is_err() const noexcept
Definition: result.hpp:136
auto map_value(U value) noexcept-> maybe::result< U, E >