summaryrefslogtreecommitdiff
path: root/boost/hof/tap.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/hof/tap.hpp')
-rw-r--r--boost/hof/tap.hpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/boost/hof/tap.hpp b/boost/hof/tap.hpp
new file mode 100644
index 0000000000..ab265c29ae
--- /dev/null
+++ b/boost/hof/tap.hpp
@@ -0,0 +1,83 @@
+/*=============================================================================
+ 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