aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/list/operation/higher/query.h30
-rw-r--r--test.cc49
2 files changed, 78 insertions, 1 deletions
diff --git a/src/list/operation/higher/query.h b/src/list/operation/higher/query.h
new file mode 100644
index 0000000..56bb203
--- /dev/null
+++ b/src/list/operation/higher/query.h
@@ -0,0 +1,30 @@
+#ifndef TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_QUERY_H_
+#define TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_QUERY_H_
+
+#include "operation/logic.h"
+
+namespace tav {
+
+template <
+ template<typename> class Function,
+ typename List
+>
+using Any = Fold<
+ Or,
+ Boolean<false>,
+ typename Map<Function, List>::type
+>;
+
+template <
+ template<typename> class Function,
+ typename List
+>
+using All = Fold<
+ And,
+ Boolean<true>,
+ typename Map<Function, List>::type
+>;
+
+}
+
+#endif // TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_QUERY_H_
diff --git a/test.cc b/test.cc
index 37f83b7..3457a60 100644
--- a/test.cc
+++ b/test.cc
@@ -7,6 +7,7 @@
#include "list/list.h"
#include "list/operation/higher/fold.h"
#include "list/operation/higher/misc.h"
+#include "list/operation/higher/query.h"
int main(int, char **) { }
@@ -382,7 +383,7 @@ static_assert(
tav::List<tav::Int<1>, tav::Int<2>, tav::Int<3>>::type
>::type
>::value,
- "(filter odd (list 1 2 3)) != (list 1 3)"
+ "(filter odd? (list 1 2 3)) != (list 1 3)"
);
// list reverse
@@ -396,3 +397,49 @@ static_assert(
>::value,
"(reverse (list 1 2 3)) != (list 3 2 1)"
);
+
+// list query
+
+static_assert(
+ std::is_same<
+ tav::Boolean<true>,
+ tav::Any<
+ tav::Odd,
+ tav::List<tav::Int<1>, tav::Int<2>, tav::Int<3>>::type
+ >::type
+ >::value,
+ "(any odd? (list 1 2 3)) != #t"
+);
+
+static_assert(
+ std::is_same<
+ tav::Boolean<false>,
+ tav::Any<
+ tav::Odd,
+ tav::List<tav::Int<2>, tav::Int<4>, tav::Int<6>>::type
+ >::type
+ >::value,
+ "(any odd? (list 2 4 6)) != #f"
+);
+
+static_assert(
+ std::is_same<
+ tav::Boolean<true>,
+ tav::All<
+ tav::Even,
+ tav::List<tav::Int<2>, tav::Int<4>, tav::Int<6>>::type
+ >::type
+ >::value,
+ "(all even? (list 2 4 6)) != #t"
+);
+
+static_assert(
+ std::is_same<
+ tav::Boolean<false>,
+ tav::All<
+ tav::Odd,
+ tav::List<tav::Int<1>, tav::Int<2>, tav::Int<3>>::type
+ >::type
+ >::value,
+ "(all odd? (list 1 2 3)) != #f"
+);