mpc
Haskell-like feature supports in C++
infix.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 {
17 template<class A1, class Op, class A2>
18 constexpr auto infixr(A1&& a1, Op&& op, A2&& a2)
19 noexcept(noexcept(std::invoke(std::forward<Op>(op), std::forward<A1>(a1), std::forward<A2>(a2))))
20 -> decltype( std::invoke(std::forward<Op>(op), std::forward<A1>(a1), std::forward<A2>(a2)))
21 { return std::invoke(std::forward<Op>(op), std::forward<A1>(a1), std::forward<A2>(a2)); }
22
24 template<class A1, class Op, class... Args>
25 constexpr auto infixr(A1&& a1, Op&& op, Args&&... args)
26 noexcept(noexcept(std::invoke(std::forward<Op>(op), std::forward<A1>(a1), infixr(std::forward<Args>(args)...))))
27 -> decltype( std::invoke(std::forward<Op>(op), std::forward<A1>(a1), infixr(std::forward<Args>(args)...)))
28 { return std::invoke(std::forward<Op>(op), std::forward<A1>(a1), infixr(std::forward<Args>(args)...)); }
29
38 template<class A1, class Op, class A2>
39 constexpr auto infixl(A1&& a1, Op&& op, A2&& a2)
40 noexcept(noexcept(std::invoke(std::forward<Op>(op), std::forward<A1>(a1), std::forward<A2>(a2))))
41 -> decltype( std::invoke(std::forward<Op>(op), std::forward<A1>(a1), std::forward<A2>(a2)))
42 { return std::invoke(std::forward<Op>(op), std::forward<A1>(a1), std::forward<A2>(a2)); }
43
45 template<class A1, class Op, class A2, class... Args>
46 constexpr auto infixl(A1&& a1, Op&& op, A2&& a2, Args&&... args)
47 noexcept(noexcept(infixl(std::invoke(std::forward<Op>(op), std::forward<A1>(a1), std::forward<A2>(a2)), std::forward<Args>(args)...)))
48 -> decltype( infixl(std::invoke(std::forward<Op>(op), std::forward<A1>(a1), std::forward<A2>(a2)), std::forward<Args>(args)...))
49 { return infixl(std::invoke(std::forward<Op>(op), std::forward<A1>(a1), std::forward<A2>(a2)), std::forward<Args>(args)...); }
50} // namespace mpc
51
52// clang-format on
constexpr auto infixl(A1 &&a1, Op &&op, A2 &&a2) noexcept(noexcept(std::invoke(std::forward< Op >(op), std::forward< A1 >(a1), std::forward< A2 >(a2)))) -> decltype(std::invoke(std::forward< Op >(op), std::forward< A1 >(a1), std::forward< A2 >(a2)))
Implements the left-associative infix notation.
Definition: infix.hpp:39
constexpr auto infixr(A1 &&a1, Op &&op, A2 &&a2) noexcept(noexcept(std::invoke(std::forward< Op >(op), std::forward< A1 >(a1), std::forward< A2 >(a2)))) -> decltype(std::invoke(std::forward< Op >(op), std::forward< A1 >(a1), std::forward< A2 >(a2)))
Implements the right-associative infix notation.
Definition: infix.hpp:18