mpc
Haskell-like feature supports in C++
functor.hpp
Go to the documentation of this file.
1
2#pragma once
7
8namespace mpc {
9 // functor
10 // https://hackage.haskell.org/package/base-4.16.0.0/docs/Control-Monad.html#t:Functor
11
13 template <class>
15
17 template <class F>
18 concept functor = requires {
19 functor_traits<std::remove_cvref_t<F>>::fmap;
20 functor_traits<std::remove_cvref_t<F>>::replace2nd;
21 };
22
23 // Methods required for the class definition.
24
25 namespace detail {
27 struct fmap_op {
28 template <class Fn, class Fa>
29 constexpr auto operator()(Fn&& fn, Fa&& fa) const noexcept(
30 noexcept( functor_traits<std::remove_cvref_t<Fa>>::fmap(std::forward<Fn>(fn), std::forward<Fa>(fa))))
31 -> decltype(functor_traits<std::remove_cvref_t<Fa>>::fmap(std::forward<Fn>(fn), std::forward<Fa>(fa)))
32 { return functor_traits<std::remove_cvref_t<Fa>>::fmap(std::forward<Fn>(fn), std::forward<Fa>(fa)); }
33 };
34
40 template <class A, class Fb>
41 constexpr auto operator()(A&& a, Fb&& fb) const noexcept(
42 noexcept( functor_traits<std::remove_cvref_t<Fb>>::replace2nd(std::forward<A>(a), std::forward<Fb>(fb))))
43 -> decltype(functor_traits<std::remove_cvref_t<Fb>>::replace2nd(std::forward<A>(a), std::forward<Fb>(fb)))
44 { return functor_traits<std::remove_cvref_t<Fb>>::replace2nd(std::forward<A>(a), std::forward<Fb>(fb)); }
45 };
46 } // namespace detail
47
48 inline namespace cpo {
50 inline constexpr partial<detail::fmap_op> fmap{};
51
54 } // namespace cpo
55
57 namespace functors {
65 inline constexpr auto replace2nd = compose(mpc::fmap, constant);
66 } // namespace functors
67
68 // Grobal methods
69
70 inline namespace cpo {
78 inline constexpr auto replace1st = flip % mpc::replace2nd;
79 } // namespace cpo
80} // namespace mpc
Requires fmap and replace2nd is valid in functor_traits .
Definition: functor.hpp:18
constexpr partial< detail::compose_op > compose
Function composition.
Definition: compose.hpp:35
constexpr partial< detail::fmap_op > fmap
fmap :: (a -> b) -> f a -> f b
Definition: functor.hpp:50
constexpr partial< detail::replace2nd_op > replace2nd
replace2nd :: a -> f b -> f a
Definition: functor.hpp:53
constexpr partial< detail::flip_op > flip
Returns a binary function which flips the first and second argument.
Definition: flip.hpp:32
constexpr auto replace1st
replace1st :: Functor f => f a -> b -> f b
Definition: functor.hpp:78
constexpr auto replace2nd
replace2nd :: a -> f b -> f a
Definition: functor.hpp:65
fmap :: (a -> b) -> f a -> f b
Definition: functor.hpp:27
replace2nd :: a -> f b -> f a
Definition: functor.hpp:39
class Functor f where
Definition: functor.hpp:14
Implements a perfect-forwarding call wrapper.
Definition: partial.hpp:63