#include "type.h"
#include "operation/math.h"
#include "operation/logic.h"
#include "conditional/if.h"
#include "list/cons.h"
#include "list/list.h"
#include "list/operation/reverse.h"
#include "list/operation/contains.h"
#include "list/operation/higher/map.h"
#include "list/operation/higher/filter.h"
#include "list/operation/higher/remove.h"
#include "list/operation/higher/partition.h"
#include "list/operation/higher/query.h"
#include "list/operation/higher/find.h"
#include "list/operation/higher/take_while.h"
#include "list/operation/higher/drop_while.h"
#include "list/operation/higher/sort.h"
#include "list/generator/iota.h"
#include "list/generator/make_list.h"
#include "list/generator/higher/list_tabulate.h"
#include "list/operation/delete.h"
#include "list/operation/delete_nth.h"
#include "function/apply.h"
int main(int, char **) { }
// equality
static_assert(
std::is_same<
tav::Boolean<true>,
tav::IsEqualType<tav::Int<1>, tav::Int<2>>
>::value,
"(IsEqualType 1 2) != #t"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::IsEqualType<tav::Int<1>, tav::Size<1>>
>::value,
"(IsEqualType (int 1) (size 2)) != #f"
);
static_assert(
std::is_same<
tav::Boolean<true>,
tav::IsEqualValue<tav::Int<1>, tav::Size<1>>
>::value,
"(equal? (int 1) (size 1)) != #t"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::IsEqualValue<tav::Int<1>, tav::Int<2>>
>::value,
"(equal? 1 2) != #f"
);
// basic math operations
static_assert(
std::is_same<
tav::Int<3>,
tav::Add<tav::Int<1>, tav::Int<2>>
>::value,
"(+ 1 2) != 3"
);
static_assert(
std::is_same<
tav::Int<4>,
tav::Substract<tav::Int<10>, tav::Int<6>>
>::value,
"(- 10 6) != 4"
);
static_assert(
std::is_same<
tav::Int<42>,
tav::Multiply<tav::Int<2>, tav::Int<21>>
>::value,
"(* 2 21) != 42"
);
static_assert(
std::is_same<
tav::Int<5>,
tav::Divide<tav::Int<10>, tav::Int<2>>
>::value,
"(/ 10 2) != 42"
);
static_assert(
std::is_same<
tav::Int<1>,
tav::Modulo<tav::Int<10>, tav::Int<3>>
>::value,
"(modulo 10 3) != 1"
);
static_assert(
std::is_same<
tav::Int<4096>,
tav::Square<tav::Int<64>>
>::value,
"(square 64) != 4096"
);
static_assert(
std::is_same<
tav::Boolean<true>,
tav::Odd<tav::Int<1>>
>::value,
"(odd? 1) != #t"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::Odd<tav::Int<2>>
>::value,
"(odd? 2) != #f"
);
static_assert(
std::is_same<
tav::Boolean<true>,
tav::GreaterThan<tav::Int<2>, tav::Int<1>>
>::value,
"(> 2 1) != #f"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::GreaterThan<tav::Int<1>, tav::Int<2>>
>::value,
"(> 1 2) != #f"
);
static_assert(
std::is_same<
tav::Boolean<true>,
tav::LowerThan<tav::Int<1>, tav::Int<2>>
>::value,
"(< 1 2) != #t"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::LowerThan<tav::Int<2>, tav::Int<1>>
>::value,
"(< 2 1) != #f"
);
// logic
static_assert(
std::is_same<
tav::Boolean<true>,
tav::And<tav::Boolean<true>, tav::Boolean<true>>
>::value,
"(and #t #t) != #t"
);
static_assert(
std