mpc
Haskell-like feature supports in C++
flip.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 namespace detail {
10 struct flip_op {
11 struct closure {
12 template<class Fn, class T, class U, class... Args>
13 constexpr auto operator()(Fn&& f, T&& t, U&& u, Args&&... args) const noexcept(
14 noexcept( std::invoke(std::forward<Fn>(f), std::forward<U>(u), std::forward<T>(t), std::forward<Args>(args)...)))
15 -> decltype(std::invoke(std::forward<Fn>(f), std::forward<U>(u), std::forward<T>(t), std::forward<Args>(args)...))
16 { return std::invoke(std::forward<Fn>(f), std::forward<U>(u), std::forward<T>(t), std::forward<Args>(args)...); }
17 };
18
19 // NOTE: You cannot write as `partial<closure>{}(std::forward<Fn>(f))`.
20 template<class Fn>
21 constexpr auto operator()(Fn&& f) const noexcept(
22 noexcept( partial(closure{}, std::forward<Fn>(f))))
23 -> decltype(partial(closure{}, std::forward<Fn>(f)))
24 { return partial(closure{}, std::forward<Fn>(f)); }
25 };
26 } // namespace detail
27
28 inline namespace cpo {
33 }
34} // namespace mpc
35
36// clang-format on
constexpr partial< detail::flip_op > flip
Returns a binary function which flips the first and second argument.
Definition: flip.hpp:32
Definition: flip.hpp:11
Definition: flip.hpp:10
Implements a perfect-forwarding call wrapper.
Definition: partial.hpp:63