Skip to content

Commit 69f558e

Browse files
committed
Added Seq
1 parent 3fca8aa commit 69f558e

File tree

7 files changed

+257
-0
lines changed

7 files changed

+257
-0
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::thru_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::t<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::t<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: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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 Function, class... Actuals>
22+
struct lax_v1::apply_m : force_t<typename Function::template m<Actuals...>> {};
23+
24+
//
25+
26+
struct lax_v1::identity_m {
27+
using eval = identity_m;
28+
template <class Expr> struct m : force_t<Expr> {};
29+
};
30+
31+
//
32+
33+
template <> struct lax_v1::compose_m<> : identity_m {};
34+
35+
template <class Function>
36+
struct lax_v1::compose_m<Function> : force_t<Function> {};
37+
38+
template <class Function1, class Function2, class... Functions>
39+
struct lax_v1::compose_m<Function1, Function2, Functions...> {
40+
using eval = compose_m;
41+
template <class Expr>
42+
struct m
43+
: force_t<apply_m<Function1,
44+
apply_m<compose_m<Function2, Functions...>, Expr>>> {};
45+
};
46+
47+
//
48+
49+
template <> struct lax_v1::pipe_m<> : identity_m {};
50+
51+
template <class Function>
52+
struct lax_v1::pipe_m<Function> : force_t<Function> {};
53+
54+
template <class Function1, class Function2, class... Functions>
55+
struct lax_v1::pipe_m<Function1, Function2, Functions...> {
56+
using eval = pipe_m;
57+
template <class Expr>
58+
struct m : force_t<apply_m<pipe_m<Function2, Functions...>,
59+
apply_m<Function1, Expr>>> {};
60+
};
61+
62+
//
63+
64+
template <class Expr> struct lax_v1::thru_m<Expr> : force_t<Expr> {};
65+
66+
template <class Expr, class Function>
67+
struct lax_v1::thru_m<Expr, Function> : force_t<apply_m<Function, Expr>> {};
68+
69+
template <class Expr, class Function, class... Functions>
70+
struct lax_v1::thru_m<Expr, Function, Functions...>
71+
: force_t<thru_m<apply_m<Function, Expr>, Functions...>> {};

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/value.hpp"
6+
7+
template <class... Elements> struct lax_v1::Seq::t { using eval = t; };
8+
9+
template <class Sequence>
10+
struct lax_v1::Seq::length_m : force_t<length_m<force_t<Sequence>>> {};
11+
template <class... Elements>
12+
struct lax_v1::Seq::length_m<lax_v1::Seq::t<Elements...>>
13+
: auto_t<sizeof...(Elements)> {};
14+
15+
template <class Predicate, class Sequence>
16+
struct lax_v1::Seq::any_m : force_t<any_m<Predicate, force_t<Sequence>>> {};
17+
template <class Predicate, class... Elements>
18+
struct lax_v1::Seq::any_m<Predicate, lax_v1::Seq::t<Elements...>>
19+
: force_t<or_m<apply_m<Predicate, Elements>...>> {};
20+
21+
template <class Function, class Sequence>
22+
struct lax_v1::Seq::map_m
23+
: force_t<map_m<force_t<Function>, force_t<Sequence>>> {};
24+
template <class Function, class... Elements>
25+
struct lax_v1::Seq::map_m<Function, lax_v1::Seq::t<Elements...>>
26+
: t<force_t<apply_m<Function, Elements>>...> {};

provides/include/lax_v1/synopsis.hpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

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

57
// force.hpp ===================================================================
@@ -53,6 +55,43 @@ template <class... Exprs> struct or_m;
5355

5456
template <class Expr> struct not_m;
5557

58+
// functional.hpp ==============================================================
59+
60+
template <template <class... Formals> class Function,
61+
size_t arity = 0,
62+
class... BoundActuals>
63+
struct fn_t;
64+
65+
template <class Function, class... Actuals> struct apply_m;
66+
67+
struct identity_m;
68+
69+
template <class... Functions> struct compose_m;
70+
71+
template <class... Functions> struct pipe_m;
72+
73+
template <class Expr, class... Functions> struct thru_m;
74+
75+
// tycon.hpp ===================================================================
76+
77+
template <class Formal, class Expr> struct tycon_f;
78+
79+
// seq.hpp =====================================================================
80+
81+
struct Seq {
82+
template <class... Elements> struct t;
83+
84+
template <class Sequence> struct length_m;
85+
86+
template <class Predicate, class Sequence> struct any_m;
87+
88+
template <class Function, class Sequence> struct map_m;
89+
90+
template <class Sequence> struct has_duplicates_m;
91+
92+
template <class Subset, class Superset> struct is_subset_of_m;
93+
};
94+
5695
// lazify.hpp ==================================================================
5796

5897
template <template <class... Formals> class Trait, class... Actuals>

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/type.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)