|
| 1 | +#pragma once |
| 2 | + |
| 3 | +#include "lax_v1/logical.hpp" |
| 4 | +#include "lax_v1/synopsis.hpp" |
| 5 | + |
| 6 | +template <template <class... Formals> class Function, |
| 7 | + size_t arity, |
| 8 | + class... BoundActuals> |
| 9 | +struct lax_v1::fn_t { |
| 10 | + using eval = fn_t; |
| 11 | + template <class... Actuals> |
| 12 | + struct m |
| 13 | + : force_t< |
| 14 | + if_m<auto_t<(sizeof...(BoundActuals) + sizeof...(Actuals) < arity)>, |
| 15 | + fn_t<Function, arity, BoundActuals..., Actuals...>, |
| 16 | + Function<BoundActuals..., Actuals...>>> {}; |
| 17 | +}; |
| 18 | + |
| 19 | +// |
| 20 | + |
| 21 | +template <class FnExpr, class... ArgExprs> |
| 22 | +struct lax_v1::apply_m : force_t<apply_t<FnExpr, ArgExprs...>> {}; |
| 23 | + |
| 24 | +// |
| 25 | + |
| 26 | +template <> struct lax_v1::compose_m<> { |
| 27 | + using eval = compose_m; |
| 28 | + template <class Expr> using m = Expr; |
| 29 | +}; |
| 30 | + |
| 31 | +template <class FnExpr> struct lax_v1::compose_m<FnExpr> : FnExpr {}; |
| 32 | + |
| 33 | +template <class FnExpr1, class FnExpr2, class... FnExprs> |
| 34 | +struct lax_v1::compose_m<FnExpr1, FnExpr2, FnExprs...> { |
| 35 | + using eval = compose_m; |
| 36 | + template <class Expr> |
| 37 | + using m = apply_t<FnExpr1, apply_t<compose_m<FnExpr2, FnExprs...>, Expr>>; |
| 38 | +}; |
| 39 | + |
| 40 | +// |
| 41 | + |
| 42 | +template <> struct lax_v1::pipe_m<> { |
| 43 | + using eval = pipe_m; |
| 44 | + template <class Expr> using m = Expr; |
| 45 | +}; |
| 46 | + |
| 47 | +template <class FnExpr> struct lax_v1::pipe_m<FnExpr> : FnExpr {}; |
| 48 | + |
| 49 | +template <class FnExpr1, class FnExpr2, class... FnExprs> |
| 50 | +struct lax_v1::pipe_m<FnExpr1, FnExpr2, FnExprs...> { |
| 51 | + using eval = pipe_m; |
| 52 | + template <class Expr> |
| 53 | + using m = apply_t<pipe_m<FnExpr2, FnExprs...>, apply_t<FnExpr1, Expr>>; |
| 54 | +}; |
| 55 | + |
| 56 | +// |
| 57 | + |
| 58 | +template <class Expr> struct lax_v1::seq_m<Expr> : Expr {}; |
| 59 | + |
| 60 | +template <class Expr, class FnExpr> |
| 61 | +struct lax_v1::seq_m<Expr, FnExpr> : apply_m<FnExpr, Expr> {}; |
| 62 | + |
| 63 | +template <class Expr, class FnExpr, class... FnExprs> |
| 64 | +struct lax_v1::seq_m<Expr, FnExpr, FnExprs...> |
| 65 | + : seq_m<apply_m<FnExpr, Expr>, FnExprs...> {}; |
0 commit comments