#![cfg(feature = "encoding")]
#![allow(warnings)]
extern crate lambda_calculus as lambda;
use lambda::data::list::pair::*;
use lambda::data::num::church::is_zero;
use lambda::*;
macro_rules! vec_church {
( $( $e:expr ),* ) => {
{
let mut vec = Vec::new();
$( vec.push($e.into_church()); )*
vec
}
};
}
macro_rules! test_pair_list {
($name:ident, $function:ident, $($($n:expr),+ => $result:expr),+) => (
#[test]
fn $name() {
$(assert_eq!(
beta(app!($function(), $($n),*), HAP, 0),
$result
);)*
}
);
}
macro_rules! test_pair_list_lists_to_num {
($name:ident, $function:ident, $($($n:expr),+ => $result:expr),+) => (
#[test]
fn $name() {
$(assert_eq!(
beta(app!($function(), $($n.into_pair_list()),*), HAP, 0),
$result.into_church()
);)*
}
);
}
macro_rules! test_pair_list_all_lists {
($name:ident, $function:ident, $($($n:expr),+ => $result:expr),+) => (
#[test]
fn $name() {
$(assert_eq!(
beta(app!($function(), $($n.into_pair_list()),*), HAP, 0),
$result.into_pair_list()
);)*
}
);
}
test_pair_list_lists_to_num!(pair_list_head, head,
vec_church![1] => 1,
vec_church![1, 2] => 1,
vec_church![1, 2, 3] => 1
);
test_pair_list_all_lists!(pair_list_tail, tail,
vec_church![1] => vec_church![],
vec_church![1, 2] => vec_church![2],
vec_church![1, 2, 3] => vec_church![2, 3]
);
test_pair_list_lists_to_num!(pair_list_length, length,
vec_church![] => 0,
vec_church![1] => 1,
vec_church![1, 2] => 2,
vec_church![1, 2, 3] => 3
);
test_pair_list!(pair_list_index, index,
0.into_church(), vec_church![1].into_pair_list() => 1.into_church(),
1.into_church(), vec_church![1, 2].into_pair_list() => 2.into_church(),
2.into_church(), vec_church![1, 2, 3].into_pair_list() => 3.into_church()
);
test_pair_list_all_lists!(pair_list_reverse, reverse,
vec_church![] => vec_church![],
vec_church![1] => vec_church![1],
vec_church![1, 2] => vec_church![2, 1],
vec_church![1, 2, 3] => vec_church![3, 2, 1]
);
test_pair_list!(pair_list_list, list,
0.into_church() => vec_church![].into_pair_list(),
1.into_church(), 1.into_church() => vec_church![1].into_pair_list(),
2.into_church(), 1.into_church(), 2.into_church() => vec_church![1, 2].into_pair_list()
);
test_pair_list_all_lists!(pair_list_append, append,
vec_church![], vec_church![] => vec_church![],
vec_church![], vec_church![1] => vec_church![1],
vec_church![1], vec_church![] => vec_church![1],
vec_church![1], vec_church![2] => vec_church![1, 2],
vec_church![1, 2], vec_church![3] => vec_church![1, 2, 3],
vec_church![1], vec_church![2, 3] => vec_church![1, 2, 3],
vec_church![1, 2], vec_church![3, 4] => vec_church![1, 2, 3, 4]
);
test_pair_list!(pair_list_drop, drop,
0.into_church(), vec_church![].into_pair_list() => vec_church![].into_pair_list(),
0.into_church(), vec_church![1].into_pair_list() => vec_church![1].into_pair_list(),
1.into_church(), vec_church![1].into_pair_list() => vec_church![].into_pair_list(),
1.into_church(), vec_church![1, 2].into_pair_list() => vec_church![2].into_pair_list(),
2.into_church(), vec_church![1, 2, 3].into_pair_list() => vec_church![3].into_pair_list()
);
test_pair_list!(pair_list_drop_while, drop_while,
is_zero(), vec_church![].into_pair_list() => vec_church![].into_pair_list(),
is_zero(), vec_church![1].into_pair_list() => vec_church![1].into_pair_list(),
is_zero(), vec_church![0, 1].into_pair_list() => vec_church![1].into_pair_list(),
is_zero(), vec_church![1, 0].into_pair_list() => vec_church![1, 0].into_pair_list()
);
test_pair_list!(pair_list_replicate, replicate,
0.into_church(), 2.into_church() => vec_church![].into_pair_list(),
1.into_church(), 2.into_church() => vec_church![2].into_pair_list(),
2.into_church(), 2.into_church() => vec_church![2, 2].into_pair_list(),
3.into_church(), 2.into_church() => vec_church![2, 2, 2].into_pair_list()
);