#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/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/generator/iota.h"
#include "list/generator/make_list.h"
#include "list/generator/higher/list_tabulate.h"
#include "list/operation/delete.h"
#include "function/apply.h"
int main(int, char **) { }
// equality
static_assert(
std::is_same<
tav::Boolean<true>,
tav::EqualType<tav::Int<1>, tav::Int<2>>
>::value,
"(EqualType 1 2) != #t"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::EqualType<tav::Int<1>, tav::Size<1>>
>::value,
"(EqualType (int 1) (size 2)) != #f"
);
static_assert(
std::is_same<
tav::Boolean<true>,
tav::EqualValue<tav::Int<1>, tav::Size<1>>
>::value,
"(equal? (int 1) (size 1)) != #t"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::EqualValue<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>>::type
>::value,
"(+ 1 2) != 3"
);
static_assert(
std::is_same<
tav::Int<4>,
tav::Substract<tav::Int<10>, tav::Int<6>>::type
>::value,
"(- 10 6) != 4"
);
static_assert(
std::is_same<
tav::Int<42>,
tav::Multiply<tav::Int<2>, tav::Int<21>>::type
>::value,
"(* 2 21) != 42"
);
static_assert(
std::is_same<
tav::Int<5>,
tav::Divide<tav::Int<10>, tav::Int<2>>::type
>::value,
"(/ 10 2) != 42"
);
static_assert(
std::is_same<
tav::Int<1>,
tav::Modulo<tav::Int<10>, tav::Int<3>>::type
>::value,
"(modulo 10 3) != 1"
);
static_assert(
std::is_same<
tav::Int<4096>,
tav::Square<tav::Int<64>>::type
>::value,
"(square 64) != 4096"
);
// logic
static_assert(
std::is_same<
tav::Boolean<true>,
tav::And<tav::Boolean<true>, tav::Boolean<true>>::type
>::value,
"(and #t #t) != #t"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::And<tav::Boolean<false>, tav::Boolean<true>>::type
>::value,
"(and #f #t) != #f"
);
static_assert(
std::is_same<
tav::Boolean<true>,
tav::Or<tav::Boolean<true>, tav::Boolean<true>>::type
>::value,
"(or #t #t) != #t"
);
static_assert(
std::is_same<
tav::Boolean<true>,
tav::Or<tav::Boolean<false>, tav::Boolean<true>>::type
>::value,
"(or #f #t) != #t"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::Or<tav::Boolean<false>, tav::Boolean<false>>::type
>::value,
"(or #f #f) != #f"
);
static_assert(
std::is_same<
tav::Boolean<true>,
tav::Xor<tav::Boolean<false>, tav::Boolean<true>>::type
>::value,
"(xor #f #t) != #t"
);
static_assert(
std::is_same<
tav::Boolean<false>,
tav::Xor<tav::Boolean<true>, tav::Boolean<true>>::type
>::value,
"(xor #t #t) != #f"
);
// conditionals
static_assert(
std::is_same<
tav::Int<1>,
tav::If<true, tav::Int<1>, tav::Int<2>>::type
>::value,
"(if #t 1 2) != 1"
);
static_assert(
std::is_same<
tav::Int<2>,
tav::If<false, tav::Int<1>, tav::Int<2>>::type
>::value,
"(if #f 1 2) != 2"
);
// cons
static_assert(
std::is_same<
tav::Int<1>,
tav::Car<
tav::Cons<tav::Int<1>, void>::type
>::type
>::value,
"(car (cons 1 void)) != 1"
);
static_assert(
std::is_same<
tav::Int<1>,
tav::Car<
tav::Cons<tav::Int<1>, tav::Int<2>>::type
>::type
>::value,
"(car (cons 1 2)) != 1"
);
static_assert(
std::is_same<
tav::Int<2>,
tav::Cdr<
tav::Cons<tav::Int<1>, tav::Int<2>>::type
>::type
>::value,
"(cdr (cons 1 2)) != 2"
);
static_assert(
std::is_same<
tav::Int<2>,
tav::Car<
tav::Cdr<