Imported Upstream version 1.64.0
[platform/upstream/boost.git] / boost / hana / fwd / monadic_compose.hpp
1 /*!
2 @file
3 Forward declares `boost::hana::monadic_compose`.
4
5 @copyright Louis Dionne 2013-2017
6 Distributed under the Boost Software License, Version 1.0.
7 (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
8  */
9
10 #ifndef BOOST_HANA_FWD_MONADIC_COMPOSE_HPP
11 #define BOOST_HANA_FWD_MONADIC_COMPOSE_HPP
12
13 #include <boost/hana/config.hpp>
14 #include <boost/hana/core/when.hpp>
15
16
17 BOOST_HANA_NAMESPACE_BEGIN
18     //! Composition of monadic functions.
19     //! @ingroup group-Monad
20     //!
21     //! Given two monadic functions `f` and `g`, `monadic_compose` returns
22     //! a new function equivalent to the composition of `f` with `g`, except
23     //! the result of `g` is `chain`ed into `f` instead of simply passed to
24     //! it, as with normal composition. `monadic_compose` satisfies
25     //! @code
26     //!     monadic_compose(f, g)(x) == chain(g(x), f)
27     //! @endcode
28     //!
29     //!
30     //! @note
31     //! Unlike `compose`, `monadic_compose` does not generalize nicely to
32     //! arities higher than one. Hence, only unary functions may be used
33     //! with `monadic_compose`.
34     //!
35     //!
36     //! Signature
37     //! ---------
38     //! Given a `Monad` `M` and two functions @f$ f : B \to M(C) @f$ and
39     //! @f$ g : A \to M(B) @f$, the signature is
40     //! @f$
41     //!     \mathtt{monadic\_compose}
42     //!         : (B \to M(C)) \times (A \to M(B)) \to (A \to M(C))
43     //! @f$.
44     //!
45     //! @param f
46     //! A monadic function with signature @f$ B \to M(C) @f$.
47     //!
48     //! @param g
49     //! A monadic function with signature @f$ A \to M(B) @f$.
50     //!
51     //!
52     //! @note
53     //! This method is not tag-dispatched, so it can't be customized directly.
54     //!
55     //!
56     //! Example
57     //! -------
58     //! @include example/monadic_compose.cpp
59 #ifdef BOOST_HANA_DOXYGEN_INVOKED
60     constexpr auto monadic_compose = [](auto&& f, auto&& g) {
61         return [perfect-capture](auto&& x) -> decltype(auto) {
62             return hana::chain(forwarded(g)(forwarded(x)), forwarded(f));
63         };
64     };
65 #else
66     struct monadic_compose_t {
67         template <typename F, typename G>
68         constexpr auto operator()(F&& f, G&& g) const;
69     };
70
71     constexpr monadic_compose_t monadic_compose{};
72 #endif
73 BOOST_HANA_NAMESPACE_END
74
75 #endif // !BOOST_HANA_FWD_MONADIC_COMPOSE_HPP