mpc
Haskell-like feature supports in C++
compose.hpp
Go to the documentation of this file.
1
2#pragma once
3#include <functional> // std::invoke
5
6// clang-format off
7
8namespace mpc {
9 // compose
10 // https://github.com/llvm/llvm-project/blob/main/libcxx/include/__functional/compose.h
11
12 namespace detail {
13 struct compose_op {
14 struct closure {
15 template<class Fn1, class Fn2, class... Args>
16 constexpr auto operator()(Fn1&& f1, Fn2&& f2, Args&&... args) const noexcept(
17 noexcept( std::invoke(std::forward<Fn1>(f1), std::invoke(std::forward<Fn2>(f2), std::forward<Args>(args)...))))
18 -> decltype(std::invoke(std::forward<Fn1>(f1), std::invoke(std::forward<Fn2>(f2), std::forward<Args>(args)...)))
19 { return std::invoke(std::forward<Fn1>(f1), std::invoke(std::forward<Fn2>(f2), std::forward<Args>(args)...)); }
20 };
21
22 // NOTE: You cannot write as `partial<closure>{}(std::forward<Fn1>(f1), std::forward<Fn2>(f2))`.
23 template<class Fn1, class Fn2>
24 constexpr auto operator()(Fn1&& f1, Fn2&& f2) const noexcept(
25 noexcept( partial(closure{}, std::forward<Fn1>(f1), std::forward<Fn2>(f2))))
26 -> decltype(partial(closure{}, std::forward<Fn1>(f1), std::forward<Fn2>(f2)))
27 { return partial(closure{}, std::forward<Fn1>(f1), std::forward<Fn2>(f2)); }
28 };
29 } // namespace detail
30
31 inline namespace cpo {
36 }
37} // namespace mpc
38
39// clang-format on
constexpr partial< detail::compose_op > compose
Function composition.
Definition: compose.hpp:35
Definition: compose.hpp:14
Definition: compose.hpp:13
Implements a perfect-forwarding call wrapper.
Definition: partial.hpp:63