You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.1 KiB
83 lines
2.1 KiB
/*============================================================================= |
|
Copyright (c) 2014 Paul Fultz II |
|
tap.h |
|
Distributed under the Boost Software License, Version 1.0. (See accompanying |
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
|
==============================================================================*/ |
|
|
|
#ifndef BOOST_HOF_GUARD_FUNCTION_TAP_H |
|
#define BOOST_HOF_GUARD_FUNCTION_TAP_H |
|
|
|
/// tap |
|
/// === |
|
/// |
|
/// Description |
|
/// ----------- |
|
/// |
|
/// The `tap` function invokes a function on the first argument passed in and |
|
/// then returns the first argument. This is useful in a chain of pipable |
|
/// function to perform operations on intermediate results. As a result, this |
|
/// function is [`pipable`](/include/boost/hof/pipable). |
|
/// |
|
/// Synopsis |
|
/// -------- |
|
/// |
|
/// template<class T, class F> |
|
/// pipable constexpr T tap(T&& x, const F& f); |
|
/// |
|
/// Requirements |
|
/// ------------ |
|
/// |
|
/// F must be: |
|
/// |
|
/// * [UnaryInvocable](UnaryInvocable) |
|
/// |
|
/// Example |
|
/// ------- |
|
/// |
|
/// #include <boost/hof.hpp> |
|
/// #include <cassert> |
|
/// #include <iostream> |
|
/// using namespace boost::hof; |
|
/// |
|
/// struct sum_f |
|
/// { |
|
/// template<class T, class U> |
|
/// T operator()(T x, U y) const |
|
/// { |
|
/// return x+y; |
|
/// } |
|
/// }; |
|
/// |
|
/// const pipable_adaptor<sum_f> sum = {}; |
|
/// int main() { |
|
/// // Prints 3 |
|
/// int r = 1 | sum(2) | tap([](int i) { std::cout << i; }) | sum(2); |
|
/// assert(r == 5); |
|
/// } |
|
/// |
|
|
|
#include <boost/hof/pipable.hpp> |
|
#include <boost/hof/apply.hpp> |
|
#include <boost/hof/detail/static_const_var.hpp> |
|
|
|
namespace boost { namespace hof { namespace detail { |
|
|
|
struct tap_f |
|
{ |
|
template<class T, class F> |
|
constexpr T operator()(T&& x, const F& f) const |
|
BOOST_HOF_RETURNS_DEDUCE_NOEXCEPT((boost::hof::apply(f, x), BOOST_HOF_FORWARD(T)(x))) |
|
{ |
|
return boost::hof::apply(f, x), BOOST_HOF_FORWARD(T)(x); |
|
} |
|
}; |
|
|
|
} |
|
|
|
BOOST_HOF_DECLARE_STATIC_VAR(tap, pipable_adaptor<detail::tap_f>); |
|
|
|
|
|
}} // namespace boost::hof |
|
|
|
#endif
|
|
|