13 #ifndef __STOUT_LAMBDA_HPP__
14 #define __STOUT_LAMBDA_HPP__
19 #include <type_traits>
23 #include <glog/logging.h>
36 using namespace std::placeholders;
40 template <
typename...>
class Iterable,
45 Iterable<V>
map(F&&
f,
const Iterable<U, Us...>& input)
51 std::inserter(output, output.begin()),
58 template <
typename...>
class OutputIterable,
59 template <
typename...>
class InputIterable,
64 OutputIterable<V>
map(F&&
f,
const InputIterable<U, Us...>& input)
66 OutputIterable<V> output;
70 std::inserter(output, output.begin()),
77 template <
typename...>
class Iterable,
81 typename =
typename std::enable_if<
82 !std::is_same<U, V>::value>
::type,
84 Iterable<V>
map(F&&
f, Iterable<U, Us...>&& input)
88 std::make_move_iterator(input.begin()),
89 std::make_move_iterator(input.end()),
90 std::inserter(output, output.begin()),
97 template <
typename...>
class Iterable,
100 typename =
typename std::enable_if<
103 Iterable<U, Us...>&&
map(F&&
f, Iterable<U, Us...>&& iterable)
106 std::make_move_iterator(iterable.begin()),
107 std::make_move_iterator(iterable.end()),
110 return std::move(iterable);
115 template <
typename...>
class OutputIterable,
116 template <
typename...>
class InputIterable,
121 OutputIterable<V>
map(F&&
f, InputIterable<U, Us...>&& input)
123 OutputIterable<V> output;
125 std::make_move_iterator(input.begin()),
126 std::make_move_iterator(input.end()),
127 std::inserter(output, output.begin()),
134 template <
typename...>
class OutputIterable,
138 OutputIterable<V>
map(F&&
f, std::initializer_list<U> input)
140 OutputIterable<V> output;
144 std::inserter(output, output.begin()),
154 std::vector<V>
map(F&&
f, std::initializer_list<U> input)
156 std::vector<V> output;
160 std::inserter(output, output.begin()),
166 #define RETURN(...) -> decltype(__VA_ARGS__) { return __VA_ARGS__; }
180 template <
typename T,
typename Args>
181 auto operator()(T&&, Args&& args)
const
182 RETURN(std::get<I - 1>(std::forward<Args>(args)))
190 template <
typename T,
typename Args>
191 auto operator()(T&& t, Args&&)
const
192 RETURN(std::forward<T>(t))
196 template <
typename F,
typename... BoundArgs>
200 std::tuple<BoundArgs...> bound_args;
202 template <
typename T,
typename Args>
203 static auto expand(T&& t, Args&& args)
205 std::forward<T>(t), std::forward<Args>(args)))
213 template <
typename F_,
typename BoundArgs_,
typename Args, std::size_t... Is>
214 static auto invoke_expand(
216 BoundArgs_&& bound_args,
222 std::get<Is>(std::forward<BoundArgs_>(bound_args)),
223 std::forward<Args>(args))...))
226 template <
typename... BoundArgs_>
227 explicit Partial(
const F&
f, BoundArgs_&&... args)
228 :
f(f), bound_args(std::forward<BoundArgs_>(args)...) {}
230 template <
typename... BoundArgs_>
231 explicit Partial(F&& f, BoundArgs_&&... args)
232 :
f(std::move(f)), bound_args(std::forward<BoundArgs_>(args)...) {}
234 Partial(
const Partial&) =
default;
235 Partial(Partial&&) =
default;
237 Partial& operator=(
const Partial&) =
default;
238 Partial& operator=(Partial&&) =
default;
240 template <
typename... Args>
241 auto operator()(Args&&... args) &
246 std::forward_as_tuple(std::forward<Args>(args)...)))
248 template <
typename... Args>
249 auto operator()(Args&&... args)
const &
254 std::forward_as_tuple(std::forward<Args>(args)...)))
256 template <
typename... Args>
257 auto operator()(Args&&... args) &&
260 std::move(bound_args),
262 std::forward_as_tuple(std::forward<Args>(args)...)))
264 template <
typename... Args>
265 auto operator()(Args&&... args)
const &&
268 std::move(bound_args),
270 std::forward_as_tuple(std::forward<Args>(args)...)))
287 template <
typename F,
typename... Args>
296 return R(std::forward<F>(
f), std::forward<Args>(args)...);
308 template <
typename R>
311 template <
typename F,
typename... Args>
314 return cpp17::invoke(std::forward<F>(
f), std::forward<Args>(args)...);
322 template <
typename F,
typename... Args>
325 cpp17::invoke(std::forward<F>(
f), std::forward<Args>(args)...);
340 template <
typename F>
344 template <
typename R,
typename... Args>
350 typename std::enable_if<
351 !std::is_same<F, CallableOnce>::value &&
352 (std::is_same<R, void>::value ||
355 cpp17::invoke(std::declval<F>(), std::declval<Args>()...)),
370 return std::move(*
f)(std::forward<Args>(args)...);
376 virtual ~Callable() =
default;
377 virtual R operator()(Args&&...) && = 0;
380 template <
typename F>
381 struct CallableFn : Callable
385 CallableFn(
const F& f) : f(f) {}
386 CallableFn(F&& f) : f(std::move(f)) {}
388 virtual R operator()(Args&&... args) &&
390 return internal::Invoke<R>{}(std::move(f), std::forward<Args>(args)...);
394 std::unique_ptr<Callable>
f;
402 template <
typename F,
typename... Args>
403 struct is_bind_expression<lambda::internal::Partial<F, Args...>>
408 #endif // __STOUT_LAMBDA_HPP__
F && f
Definition: defer.hpp:270
CallableOnce(F &&f)
Definition: lambda.hpp:358
internal::Partial< typename std::decay< F >::type, typename std::decay< Args >::type...> partial(F &&f, Args &&...args)
Definition: lambda.hpp:291
void operator()(F &&f, Args &&...args)
Definition: lambda.hpp:323
R operator()(F &&f, Args &&...args)
Definition: lambda.hpp:312
Definition: lambda.hpp:197
Definition: lambda.hpp:177
Iterable< V > map(F &&f, const Iterable< U, Us...> &input)
Definition: lambda.hpp:45
make_integer_sequence< std::size_t, N > make_index_sequence
Definition: cpp14.hpp:61
process::Future< Nothing > transform(process::Owned< Reader< T >> &&reader, const std::function< std::string(const T &)> &func, process::http::Pipe::Writer writer)
This is a helper function that reads records from a Reader, applies a transformation to the records a...
Definition: recordio.hpp:112
R operator()(Args...args)&&
Definition: lambda.hpp:367
Try< uint32_t > type(const std::string &path)
Definition: lambda.hpp:309
Try< Nothing > bind(int_fd s, const Address &address)
Definition: network.hpp:46
#define RETURN(...)
Definition: lambda.hpp:166
Definition: lambda.hpp:341