Skip to content

Commit a83ef61

Browse files
committed
Added Seq
1 parent 1dd3af8 commit a83ef61

File tree

7 files changed

+254
-2
lines changed

7 files changed

+254
-2
lines changed

internals/testing/functional_test.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include "lax_v1/arithmetic.hpp"
2+
#include "lax_v1/functional.hpp"
3+
4+
#include "config.hpp"
5+
6+
static_assert(lax::value_of_v<lax::apply_m<
7+
lax::compose_m<lax::fn_t<lax::neg_m>, lax::fn_t<lax::neg_m>>,
8+
lax::value_t<int, 2>>> == 2);
9+
10+
static_assert(
11+
lax::value_of_v<lax::apply_m<
12+
lax::compose_m<lax::fn_t<lax::add_m, 2, lax::value_t<int, 1>>,
13+
lax::fn_t<lax::neg_m>,
14+
lax::fn_t<lax::add_m, 2, lax::value_t<int, -1>>>,
15+
lax::value_t<int, 1>>> == 1);
16+
17+
static_assert(lax::value_of_v<lax::apply_m<
18+
lax::pipe_m<lax::fn_t<lax::add_m, 2, lax::value_t<int, 1>>,
19+
lax::fn_t<lax::neg_m>,
20+
lax::fn_t<lax::add_m, 2, lax::value_t<int, -1>>>,
21+
lax::value_t<int, 1>>> == -3);
22+
23+
static_assert(
24+
lax::value_of_v<
25+
lax::seq_m<lax::value_t<int, 1>,
26+
lax::fn_t<lax::add_m, 2, lax::value_t<int, 1>>,
27+
lax::fn_t<lax::neg_m>,
28+
lax::fn_t<lax::add_m, 2, lax::value_t<int, -1>>>> == -3);

internals/testing/seq_test.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "lax_v1/arithmetic.hpp"
2+
#include "lax_v1/functional.hpp"
3+
#include "lax_v1/seq.hpp"
4+
#include "lax_v1/value.hpp"
5+
6+
#include "config.hpp"
7+
8+
#include <type_traits>
9+
10+
using values_t = lax::Seq::m<lax::value_t<int, 3>,
11+
lax::value_t<int, 1>,
12+
lax::value_t<int, 4>,
13+
lax::value_t<int, 1>,
14+
lax::value_t<int, 5>,
15+
lax::value_t<int, 9>>;
16+
17+
static_assert(lax::value_of_v<lax::Seq::length_m<values_t>> == 6);
18+
19+
static_assert(std::is_same_v<
20+
lax::force_t<lax::Seq::map_m<lax::fn_t<lax::neg_m>, values_t>>,
21+
lax::Seq::m<lax::value_t<int, -3>,
22+
lax::value_t<int, -1>,
23+
lax::value_t<int, -4>,
24+
lax::value_t<int, -1>,
25+
lax::value_t<int, -5>,
26+
lax::value_t<int, -9>>>);

internals/testing/tycon_test.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "lax_v1/arithmetic.hpp"
2+
#include "lax_v1/functional.hpp"
3+
#include "lax_v1/tycon.hpp"
4+
5+
#include "config.hpp"
6+
7+
struct V;
8+
9+
static_assert(
10+
lax::value_of_v<lax::apply_m<lax::tycon_f<V, lax::add_m<V, lax::neg_m<V>>>,
11+
lax::value_t<int, 1>>> == 0);
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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...> {};

provides/include/lax_v1/seq.hpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include "lax_v1/force.hpp"
4+
#include "lax_v1/logical.hpp"
5+
#include "lax_v1/synopsis.hpp"
6+
#include "lax_v1/value.hpp"
7+
8+
template <class... ElemExprs> struct lax_v1::Seq::m { using eval = m; };
9+
10+
template <class SeqExpr>
11+
struct lax_v1::Seq::length_m : length_m<force_t<SeqExpr>> {};
12+
template <class... ElemExprs>
13+
struct lax_v1::Seq::length_m<lax_v1::Seq::m<ElemExprs...>>
14+
: auto_t<sizeof...(ElemExprs)> {};
15+
16+
template <class Predicate, class SeqExpr>
17+
struct lax_v1::Seq::any_m : any_m<Predicate, force_t<SeqExpr>> {};
18+
template <class Predicate, class... ElemExprs>
19+
struct lax_v1::Seq::any_m<Predicate, lax_v1::Seq::m<ElemExprs...>>
20+
: or_m<apply_m<Predicate, ElemExprs>...> {};
21+
22+
template <class Function, class SeqExpr>
23+
struct lax_v1::Seq::map_m : map_m<force_t<Function>, force_t<SeqExpr>> {};
24+
template <class Function, class... ElemExprs>
25+
struct lax_v1::Seq::map_m<Function, lax_v1::Seq::m<ElemExprs...>>
26+
: m<apply_t<Function, ElemExprs>...> {};

provides/include/lax_v1/synopsis.hpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
#pragma once
22

3+
#include <cstddef>
4+
35
namespace lax_v1 {
46

7+
// force.hpp ===================================================================
8+
9+
template <class Expr> using force_t = typename Expr::eval;
10+
511
// type.hpp ====================================================================
612

713
template <class T> struct type_t;
@@ -49,9 +55,43 @@ template <class... Exprs> struct or_m;
4955

5056
template <class Expr> struct not_m;
5157

52-
// force.hpp ===================================================================
58+
// functional.hpp ==============================================================
5359

54-
template <class Expr> using force_t = typename Expr::eval;
60+
template <template <class... Formals> class Function,
61+
size_t arity = 0,
62+
class... BoundActuals>
63+
struct fn_t;
64+
65+
template <class FnExpr, class... ArgExprs>
66+
using apply_t = typename FnExpr::template m<ArgExprs...>::eval;
67+
68+
template <class FnExpr, class... ArgExprs> struct apply_m;
69+
70+
template <class... FnExprs> struct compose_m;
71+
72+
template <class... FnExprs> struct pipe_m;
73+
74+
template <class Expr, class... FnExprs> struct seq_m;
75+
76+
// tycon.hpp ===================================================================
77+
78+
template <class Formal, class Expr> struct tycon_f;
79+
80+
// seq.hpp =====================================================================
81+
82+
struct Seq {
83+
template <class... ElemExprs> struct m;
84+
85+
template <class SeqExpr> struct length_m;
86+
87+
template <class Predicate, class SeqExpr> struct any_m;
88+
89+
template <class Function, class SeqExpr> struct map_m;
90+
91+
template <class SeqExpr> struct has_duplicates_m;
92+
93+
template <class SubExpr, class SuperExpr> struct is_subset_of_m;
94+
};
5595

5696
// lazify.hpp ==================================================================
5797

provides/include/lax_v1/tycon.hpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#pragma once
2+
3+
#include "lax_v1/synopsis.hpp"
4+
5+
namespace lax_v1 {
6+
7+
class tycon_private {
8+
template <class Formal, class Expr> friend struct tycon_f;
9+
10+
template <class Formal, class Actual, class Expr> struct subst_m;
11+
12+
template <class Formal, class Actual, class Expr>
13+
using subst_t = type_of_t<subst_m<Formal, Actual, Expr>>;
14+
};
15+
16+
} // namespace lax_v1
17+
18+
template <class Formal, class Expr> struct lax_v1::tycon_f {
19+
using eval = tycon_f;
20+
template <class Actual>
21+
struct m : tycon_private::subst_t<Formal, Actual, Expr> {};
22+
};
23+
24+
//
25+
26+
template <class Formal, class Actual>
27+
struct lax_v1::tycon_private::subst_m<Formal, Actual, Formal> : type_t<Actual> {
28+
};
29+
30+
template <class Formal, class Actual, class Expr>
31+
struct lax_v1::tycon_private::
32+
subst_m<Formal, Actual, lax_v1::tycon_f<Formal, Expr>>
33+
: type_t<tycon_f<Formal, Expr>> {};
34+
35+
template <class Formal,
36+
class Actual,
37+
template <class... Formals>
38+
class Function,
39+
class... Exprs>
40+
struct lax_v1::tycon_private::subst_m<Formal, Actual, Function<Exprs...>>
41+
: type_t<Function<subst_t<Formal, Actual, Exprs>...>> {};
42+
43+
template <class Formal,
44+
class Actual,
45+
template <template <class... Formals> class F, class... As>
46+
class R,
47+
template <class... Formals>
48+
class F,
49+
class... Exprs>
50+
struct lax_v1::tycon_private::subst_m<Formal, Actual, R<F, Exprs...>>
51+
: type_t<R<F, subst_t<Formal, Actual, Exprs>...>> {};
52+
53+
template <class Formal, class Actual, class ReturnType, class... ParamTypes>
54+
struct lax_v1::tycon_private::subst_m<Formal, Actual, ReturnType(ParamTypes...)>
55+
: type_t<subst_t<Formal, Actual, ReturnType>(
56+
subst_t<Formal, Actual, ParamTypes>...)> {};

0 commit comments

Comments
 (0)