Update most of the tests and builder functions to use the new delay_branch_functions

This commit is contained in:
microproofs 2024-08-02 01:37:23 -04:00 committed by Kasey
parent d7e9fef4d3
commit 4cf81a19b1
2 changed files with 475 additions and 601 deletions

View File

@ -1198,8 +1198,7 @@ pub fn list_access_to_uplc(
} }
return Term::var("empty_list") return Term::var("empty_list")
.choose_list(term.delay(), otherwise_delayed) .delay_empty_choose_list(term, otherwise_delayed)
.force()
.lambda("empty_list"); .lambda("empty_list");
} }
@ -1272,11 +1271,10 @@ pub fn list_access_to_uplc(
} else if tail_present { } else if tail_present {
// Custom error instead of trying to do head_item on a possibly empty list. // Custom error instead of trying to do head_item on a possibly empty list.
Term::var(tail_name.to_string()) Term::var(tail_name.to_string())
.choose_list( .delay_filled_choose_list(
otherwise_delayed.clone(), otherwise_delayed.clone(),
head_item(name, tipo, &tail_name, acc).delay(), head_item(name, tipo, &tail_name, acc),
) )
.force()
.lambda(tail_name) .lambda(tail_name)
} else if otherwise_delayed == Term::Error.delay() { } else if otherwise_delayed == Term::Error.delay() {
// Check head is last item in this list // Check head is last item in this list
@ -1286,14 +1284,13 @@ pub fn list_access_to_uplc(
&tail_name, &tail_name,
Term::tail_list() Term::tail_list()
.apply(Term::var(tail_name.to_string())) .apply(Term::var(tail_name.to_string()))
.choose_list(acc.delay(), Term::Error.delay()) .delayed_choose_list(acc, Term::Error),
.force(),
) )
.lambda(tail_name) .lambda(tail_name)
} else { } else {
// Custom error if list is not empty after this head // Custom error if list is not empty after this head
Term::var(tail_name.to_string()) Term::var(tail_name.to_string())
.choose_list( .delay_filled_choose_list(
otherwise_delayed.clone(), otherwise_delayed.clone(),
head_item( head_item(
name, name,
@ -1301,12 +1298,12 @@ pub fn list_access_to_uplc(
&tail_name, &tail_name,
Term::tail_list() Term::tail_list()
.apply(Term::var(tail_name.to_string())) .apply(Term::var(tail_name.to_string()))
.choose_list(acc.delay(), otherwise_delayed.clone()) .delay_empty_choose_list(
.force(), acc,
otherwise_delayed.clone(),
),
),
) )
.delay(),
)
.force()
.lambda(tail_name) .lambda(tail_name)
} }
} }
@ -1333,7 +1330,7 @@ pub fn list_access_to_uplc(
// case for a custom error if the list is empty at this point // case for a custom error if the list is empty at this point
Term::var(tail_name.to_string()) Term::var(tail_name.to_string())
.choose_list( .delay_filled_choose_list(
otherwise_delayed.clone(), otherwise_delayed.clone(),
head_item( head_item(
name, name,
@ -1342,10 +1339,8 @@ pub fn list_access_to_uplc(
acc.apply( acc.apply(
Term::tail_list().apply(Term::var(tail_name.to_string())), Term::tail_list().apply(Term::var(tail_name.to_string())),
), ),
),
) )
.delay(),
)
.force()
.lambda(tail_name) .lambda(tail_name)
} }
} }

View File

@ -89,6 +89,8 @@ fn assert_uplc(source_code: &str, expected: Term<Name>, should_fail: bool) {
TestType::Validator(func) => { TestType::Validator(func) => {
let program = generator.generate(func, &script.1); let program = generator.generate(func, &script.1);
let pretty_program = program.to_pretty();
let debruijn_program: Program<DeBruijn> = program.try_into().unwrap(); let debruijn_program: Program<DeBruijn> = program.try_into().unwrap();
let expected = Program { let expected = Program {
@ -98,9 +100,16 @@ fn assert_uplc(source_code: &str, expected: Term<Name>, should_fail: bool) {
let expected = optimize::aiken_optimize_and_intern(expected); let expected = optimize::aiken_optimize_and_intern(expected);
let pretty_expected = expected.to_pretty();
let expected: Program<DeBruijn> = expected.try_into().unwrap(); let expected: Program<DeBruijn> = expected.try_into().unwrap();
assert_eq!(debruijn_program.to_pretty(), expected.to_pretty()); assert!(
debruijn_program.to_pretty() == expected.to_pretty(),
"=============== generated:\n{}\n\n=============== expected:\n{}",
pretty_program,
pretty_expected,
);
} }
} }
} }
@ -3690,52 +3699,51 @@ fn when_tuple_deconstruction() {
assert_uplc( assert_uplc(
src, src,
Term::choose_data_constr(
Name::text("__val").into(),
|v| {
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat")))
.if_then_else( .delay_true_if_then_else(
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red")))
.if_then_else( .delay_true_if_then_else(
Term::equals_integer() Term::equals_integer()
.apply( .apply(Term::un_i_data().apply(Term::head_list().apply(
Term::un_i_data().apply(
Term::head_list().apply(
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("a")), Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("a")),
), )))
),
)
.apply(Term::var("x")) .apply(Term::var("x"))
.delayed_if_then_else( .delayed_if_then_else(
Term::bool(true), Term::bool(true),
Term::bool(false).delayed_trace(Term::string("a.idx == x ? False")), Term::bool(false)
.delayed_trace(Term::string("a.idx == x ? False")),
) )
.lambda("x") .lambda("x")
.apply( .apply(Term::un_i_data().apply(
Term::un_i_data() Term::head_list().apply(Term::var("red_constr_fields")),
.apply(Term::head_list().apply(Term::var("red_constr_fields"))), ))
)
.lambda("red_constr_fields") .lambda("red_constr_fields")
.apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("red"))) .apply(
.delay(), Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("red")),
),
Term::var("other_clauses"), Term::var("other_clauses"),
) )
.force()
.lambda("a") .lambda("a")
.apply(Term::head_list().apply(Term::var("dat_constr_fields"))) .apply(Term::head_list().apply(Term::var("dat_constr_fields")))
.lambda("dat_constr_fields") .lambda("dat_constr_fields")
.apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))) .apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))),
.delay(),
Term::var("other_clauses"), Term::var("other_clauses"),
) )
.force()
.lambda("other_clauses") .lambda("other_clauses")
.apply(Term::bool(true).delay()) .apply(Term::bool(true).delay())
.lambda("dat") .lambda("dat")
.apply(Term::head_list().apply(Term::var("pair_subject"))) .apply(Term::head_list().apply(Term::var("pair_subject")))
.lambda("red") .lambda("red")
.apply(Term::head_list().apply(Term::tail_list().apply(Term::var("pair_subject")))) .apply(
Term::head_list().apply(Term::tail_list().apply(Term::var("pair_subject"))),
)
.lambda("pair_subject") .lambda("pair_subject")
.apply( .apply(
Term::mk_cons().apply(Term::var("dat")).apply( Term::mk_cons().apply(Term::var("dat")).apply(
@ -3761,56 +3769,45 @@ fn when_tuple_deconstruction() {
.apply(Term::var("subject")) .apply(Term::var("subject"))
.delayed_if_then_else( .delayed_if_then_else(
Term::var("red_constr_fields") Term::var("red_constr_fields")
.choose_list( .delay_filled_choose_list(
Term::var("param_msg"), Term::var("param_msg"),
Term::choose_data_integer(
Name::text("__val").into(),
|v| {
Term::tail_list() Term::tail_list()
.apply(Term::var("red_constr_fields")) .apply(Term::var("red_constr_fields"))
.choose_list( .delay_empty_choose_list(
Term::unit().delay(), Term::unit(),
Term::var("param_msg"), Term::var("param_msg"),
) )
.force()
.lambda("field_1") .lambda("field_1")
.apply( .apply(v)
Term::var("__val") },
.choose_data( &Term::var("param_msg"),
Term::var("param_msg"),
Term::var("param_msg"),
Term::var("param_msg"),
Term::un_i_data()
.apply(Term::var("__val"))
.delay(),
Term::var("param_msg"),
) )
.force()
.lambda("__val") .lambda("__val")
.apply( .apply(
Term::head_list() Term::head_list()
.apply(Term::var("red_constr_fields")), .apply(Term::var("red_constr_fields")),
), ),
) )
.delay(),
)
.force()
.lambda("red_constr_fields") .lambda("red_constr_fields")
.apply( .apply(
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("red")), Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("red")),
), ),
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(1.into())) .apply(Term::integer(1.into()))
.apply(Term::var("subject")) .apply(Term::var("subject"))
.if_then_else( .delay_true_if_then_else(
Term::var(CONSTR_FIELDS_EXPOSER) Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("red")) .apply(Term::var("red"))
.choose_list( .delay_empty_choose_list(
Term::unit().delay(), Term::unit(),
Term::var("param_msg"), Term::var("param_msg"),
) ),
.force()
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) ),
.force(),
) )
.lambda("subject") .lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red")))
@ -3821,19 +3818,12 @@ fn when_tuple_deconstruction() {
.apply(Term::var("red:RedSpend")), .apply(Term::var("red:RedSpend")),
) )
.lambda("red") .lambda("red")
.apply( .apply(v)
Term::var("__val") },
.choose_data( &Term::var("red:RedSpend"),
Term::var("__val").delay(),
Term::var("red:RedSpend"),
Term::var("red:RedSpend"),
Term::var("red:RedSpend"),
Term::var("red:RedSpend"),
) )
.force()
.lambda("__val") .lambda("__val")
.apply(Term::var("red")), .apply(Term::var("red"))
)
.lambda("red") .lambda("red")
.lambda("_") .lambda("_")
.apply( .apply(
@ -3845,61 +3835,43 @@ fn when_tuple_deconstruction() {
.apply(Term::var("subject")) .apply(Term::var("subject"))
.delayed_if_then_else( .delayed_if_then_else(
Term::var("dat_constr_fields") Term::var("dat_constr_fields")
.choose_list( .delay_filled_choose_list(
Term::var("param_msg"), Term::var("param_msg"),
Term::choose_data_constr(
Name::text("__val").into(),
|v| {
Term::tail_list() Term::tail_list()
.apply(Term::var("dat_constr_fields")) .apply(Term::var("dat_constr_fields"))
.choose_list( .delay_empty_choose_list(
Term::unit() Term::unit().lambda("_").apply(
.lambda("_")
.apply(
Term::var("expect_Thing") Term::var("expect_Thing")
.apply(Term::var("field_1")) .apply(Term::var("field_1"))
.apply(Term::var("param_msg")), .apply(Term::var("param_msg")),
) ),
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) )
.force()
.lambda("field_1") .lambda("field_1")
.apply( .apply(v)
Term::var("__val") },
.choose_data( &Term::var("param_msg"),
Term::var("__val").delay(),
Term::var("param_msg"),
Term::var("param_msg"),
Term::var("param_msg"),
Term::var("param_msg"),
) )
.force()
.lambda("__val") .lambda("__val")
.apply( .apply(Term::head_list().apply(Term::var("dat_constr_fields"))),
Term::head_list()
.apply(Term::var("dat_constr_fields")),
),
) )
.delay(),
)
.force()
.lambda("dat_constr_fields") .lambda("dat_constr_fields")
.apply( .apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))),
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat")),
),
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(1.into())) .apply(Term::integer(1.into()))
.apply(Term::var("subject")) .apply(Term::var("subject"))
.if_then_else( .delay_true_if_then_else(
Term::var(CONSTR_FIELDS_EXPOSER) Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("dat")) .apply(Term::var("dat"))
.choose_list( .delay_empty_choose_list(
Term::unit().delay(), Term::unit(),
Term::var("param_msg"), Term::var("param_msg"),
) ),
.force()
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) ),
.force(),
) )
.lambda("subject") .lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat")))
@ -3911,17 +3883,16 @@ fn when_tuple_deconstruction() {
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply(Term::var("subject")) .apply(Term::var("subject"))
.if_then_else( .delay_true_if_then_else(
Term::var("field_1_constr_fields") Term::var("field_1_constr_fields")
.choose_list( .delay_filled_choose_list(
Term::var("param_msg"), Term::var("param_msg"),
Term::tail_list() Term::tail_list()
.apply(Term::var("field_1_constr_fields")) .apply(Term::var("field_1_constr_fields"))
.choose_list( .delay_empty_choose_list(
Term::unit().delay(), Term::unit(),
Term::var("param_msg"), Term::var("param_msg"),
) )
.force()
.lambda("idx") .lambda("idx")
.apply( .apply(
Term::var("__val") Term::var("__val")
@ -3937,23 +3908,17 @@ fn when_tuple_deconstruction() {
.force() .force()
.lambda("__val") .lambda("__val")
.apply( .apply(
Term::head_list().apply(Term::var( Term::head_list()
"field_1_constr_fields", .apply(Term::var("field_1_constr_fields")),
)), ),
), ),
) )
.delay(),
)
.force()
.lambda("field_1_constr_fields") .lambda("field_1_constr_fields")
.apply( .apply(
Term::var(CONSTR_FIELDS_EXPOSER) Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("field_1")),
.apply(Term::var("field_1")), ),
)
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) )
.force()
.lambda("subject") .lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_1"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_1")))
.lambda("param_msg") .lambda("param_msg")
@ -4026,13 +3991,11 @@ fn when_tuple_empty_lists() {
assert_uplc( assert_uplc(
src, src,
Term::var("bucket_tuple_fst") Term::var("bucket_tuple_fst")
.choose_list(Term::bool(false).delay(), Term::var("delayed_clause")) .delay_empty_choose_list(Term::bool(false), Term::var("delayed_clause"))
.force()
.lambda("delayed_clause") .lambda("delayed_clause")
.apply( .apply(
Term::var("bucket_tuple_snd") Term::var("bucket_tuple_snd")
.choose_list(Term::bool(false).delay(), Term::var("delayed_clause")) .delay_empty_choose_list(Term::bool(false), Term::var("delayed_clause"))
.force()
.lambda("delayed_clause") .lambda("delayed_clause")
.apply( .apply(
Term::equals_integer() Term::equals_integer()
@ -4113,15 +4076,12 @@ fn generic_validator_type_test() {
let void_check = Term::equals_integer() let void_check = Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply(Term::fst_pair().apply(Term::unconstr_data().apply(Term::var("__val")))) .apply(Term::fst_pair().apply(Term::unconstr_data().apply(Term::var("__val"))))
.if_then_else( .delay_true_if_then_else(
Term::snd_pair() Term::snd_pair()
.apply(Term::unconstr_data().apply(Term::var("__val"))) .apply(Term::unconstr_data().apply(Term::var("__val")))
.choose_list(Term::unit().delay(), Term::var("param_msg")) .delay_empty_choose_list(Term::unit(), Term::var("param_msg")),
.force()
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) );
.force();
assert_uplc( assert_uplc(
src, src,
@ -4169,36 +4129,29 @@ fn generic_validator_type_test() {
.delayed_if_then_else( .delayed_if_then_else(
Term::var(CONSTR_FIELDS_EXPOSER) Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("param_0")) .apply(Term::var("param_0"))
.choose_list(Term::unit().delay(), Term::var("param_msg")) .delay_empty_choose_list(Term::unit(), Term::var("param_msg")),
.force(),
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(1.into())) .apply(Term::integer(1.into()))
.apply(Term::var("subject")) .apply(Term::var("subject"))
.if_then_else( .delay_true_if_then_else(
Term::var("r_fields") Term::var("r_fields")
.choose_list( .delay_filled_choose_list(
Term::var("param_msg"), Term::var("param_msg"),
Term::var("tail_1") Term::var("tail_1")
.choose_list( .delay_filled_choose_list(
Term::var("param_msg"), Term::var("param_msg"),
Term::tail_list() Term::tail_list()
.apply(Term::var("tail_1")) .apply(Term::var("tail_1"))
.choose_list( .delay_empty_choose_list(
Term::unit() Term::unit().lambda("_").apply(
.lambda("_")
.apply(
Term::var("__expect_B") Term::var("__expect_B")
.apply(Term::var( .apply(Term::var("field_B"))
"field_B",
))
.apply(Term::var( .apply(Term::var(
"param_msg", "param_msg",
)), )),
) ),
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) )
.force()
.lambda("field_B") .lambda("field_B")
.apply( .apply(
Term::var("__val") Term::var("__val")
@ -4212,10 +4165,8 @@ fn generic_validator_type_test() {
.force() .force()
.lambda("__val") .lambda("__val")
.apply(field_b), .apply(field_b),
),
) )
.delay(),
)
.force()
.lambda("tail_1") .lambda("tail_1")
.apply( .apply(
Term::tail_list() Term::tail_list()
@ -4237,19 +4188,15 @@ fn generic_validator_type_test() {
Term::head_list() Term::head_list()
.apply(Term::var("r_fields")), .apply(Term::var("r_fields")),
), ),
),
) )
.delay(),
)
.force()
.lambda("r_fields") .lambda("r_fields")
.apply( .apply(
Term::var(CONSTR_FIELDS_EXPOSER) Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("param_0")), .apply(Term::var("param_0")),
) ),
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) ),
.force(),
) )
.lambda("subject") .lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("param_0"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("param_0")))
@ -4261,17 +4208,16 @@ fn generic_validator_type_test() {
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply(Term::var("subject")) .apply(Term::var("subject"))
.if_then_else( .delay_true_if_then_else(
Term::var("B_fields") Term::var("B_fields")
.choose_list( .delay_filled_choose_list(
Term::var("param_msg"), Term::var("param_msg"),
Term::tail_list() Term::tail_list()
.apply(Term::var("B_fields")) .apply(Term::var("B_fields"))
.choose_list( .delay_empty_choose_list(
Term::unit().delay(), Term::unit(),
Term::var("param_msg"), Term::var("param_msg"),
) )
.force()
.lambda("something") .lambda("something")
.apply( .apply(
Term::var("__val") Term::var("__val")
@ -4288,19 +4234,15 @@ fn generic_validator_type_test() {
Term::head_list() Term::head_list()
.apply(Term::var("B_fields")), .apply(Term::var("B_fields")),
), ),
),
) )
.delay(),
)
.force()
.lambda("B_fields") .lambda("B_fields")
.apply( .apply(
Term::var(CONSTR_FIELDS_EXPOSER) Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("param_0")), .apply(Term::var("param_0")),
) ),
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) )
.force()
.lambda("subject") .lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("param_0"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("param_0")))
.lambda("param_msg") .lambda("param_msg")
@ -4985,23 +4927,19 @@ fn expect_head_no_tail() {
assert_uplc( assert_uplc(
src, src,
Term::var("a") Term::var("a")
.choose_list( .delay_filled_choose_list(
Term::var("expect[h]=a"), Term::var("expect[h]=a"),
Term::tail_list() Term::tail_list()
.apply(Term::var("a")) .apply(Term::var("a"))
.choose_list( .delay_empty_choose_list(
Term::equals_integer() Term::equals_integer()
.apply(Term::var("h")) .apply(Term::var("h"))
.apply(Term::var("h")) .apply(Term::var("h")),
.delay(),
Term::var("expect[h]=a"), Term::var("expect[h]=a"),
) )
.force()
.lambda("h") .lambda("h")
.apply(Term::un_i_data().apply(Term::head_list().apply(Term::var("a")))) .apply(Term::un_i_data().apply(Term::head_list().apply(Term::var("a")))),
.delay(),
) )
.force()
.lambda("a") .lambda("a")
.apply(Term::list_values(vec![ .apply(Term::list_values(vec![
Constant::Data(Data::integer(1.into())), Constant::Data(Data::integer(1.into())),
@ -5031,17 +4969,17 @@ fn expect_head3_no_tail() {
assert_uplc( assert_uplc(
src, src,
Term::var("a") Term::var("a")
.choose_list( .delay_filled_choose_list(
Term::var("expect[h,i,j]=a"), Term::var("expect[h,i,j]=a"),
Term::var("tail_1") Term::var("tail_1")
.choose_list( .delay_filled_choose_list(
Term::var("expect[h,i,j]=a"), Term::var("expect[h,i,j]=a"),
Term::var("tail_2") Term::var("tail_2")
.choose_list( .delay_filled_choose_list(
Term::var("expect[h,i,j]=a"), Term::var("expect[h,i,j]=a"),
Term::tail_list() Term::tail_list()
.apply(Term::var("tail_2")) .apply(Term::var("tail_2"))
.choose_list( .delay_empty_choose_list(
Term::equals_integer() Term::equals_integer()
.apply(Term::var("h")) .apply(Term::var("h"))
.apply(Term::var("h")) .apply(Term::var("h"))
@ -5056,11 +4994,9 @@ fn expect_head3_no_tail() {
.apply(Term::var("j")) .apply(Term::var("j"))
.apply(Term::var("j")), .apply(Term::var("j")),
Term::bool(false), Term::bool(false),
) ),
.delay(),
Term::var("expect[h,i,j]=a"), Term::var("expect[h,i,j]=a"),
) )
.force()
.lambda("j") .lambda("j")
.apply( .apply(
Term::un_i_data() Term::un_i_data()
@ -5068,24 +5004,19 @@ fn expect_head3_no_tail() {
) )
.delay(), .delay(),
) )
.force()
.lambda("tail_2") .lambda("tail_2")
.apply(Term::tail_list().apply(Term::var("tail_1"))) .apply(Term::tail_list().apply(Term::var("tail_1")))
.lambda("i") .lambda("i")
.apply( .apply(
Term::un_i_data() Term::un_i_data()
.apply(Term::head_list().apply(Term::var("tail_1"))), .apply(Term::head_list().apply(Term::var("tail_1"))),
),
) )
.delay(),
)
.force()
.lambda("tail_1") .lambda("tail_1")
.apply(Term::tail_list().apply(Term::var("a"))) .apply(Term::tail_list().apply(Term::var("a")))
.lambda("h") .lambda("h")
.apply(Term::un_i_data().apply(Term::head_list().apply(Term::var("a")))) .apply(Term::un_i_data().apply(Term::head_list().apply(Term::var("a")))),
.delay(),
) )
.force()
.lambda("a") .lambda("a")
.apply(Term::list_values(vec![ .apply(Term::list_values(vec![
Constant::Data(Data::integer(1.into())), Constant::Data(Data::integer(1.into())),
@ -5137,7 +5068,7 @@ fn expect_head3_cast_data_no_tail() {
Constant::Data(Data::integer(2.into())), Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())), Constant::Data(Data::integer(3.into())),
]) ])
.choose_list( .delay_filled_choose_list(
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
Term::var("__var") Term::var("__var")
.choose_data( .choose_data(
@ -5150,17 +5081,14 @@ fn expect_head3_cast_data_no_tail() {
Constant::Data(Data::integer(2.into())), Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())), Constant::Data(Data::integer(3.into())),
])) ]))
.choose_list( .delay_filled_choose_list(
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
then.lambda("__var").apply(todo!()).delay(), then.lambda("__var").apply(todo!()),
) )
.force()
.lambda("h") .lambda("h")
.apply(Term::un_i_data().apply(Term::var("__var"))) .apply(Term::un_i_data().apply(Term::var("__var"))),
.delay(),
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
) )
.force()
.lambda("__var") .lambda("__var")
.apply(Term::head_list().apply(Term::list_values(vec![ .apply(Term::head_list().apply(Term::list_values(vec![
Constant::Data(Data::integer(1.into())), Constant::Data(Data::integer(1.into())),
@ -5169,7 +5097,6 @@ fn expect_head3_cast_data_no_tail() {
]))) ])))
.delay(), .delay(),
) )
.force()
.delay(), .delay(),
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
@ -5210,7 +5137,7 @@ fn expect_head_cast_data_no_tail() {
Constant::Data(Data::integer(2.into())), Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())), Constant::Data(Data::integer(3.into())),
]) ])
.choose_list( .delay_filled_choose_list(
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
Term::var("__var") Term::var("__var")
.choose_data( .choose_data(
@ -5223,14 +5150,12 @@ fn expect_head_cast_data_no_tail() {
Constant::Data(Data::integer(2.into())), Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())), Constant::Data(Data::integer(3.into())),
])) ]))
.choose_list( .delay_empty_choose_list(
Term::equals_integer() Term::equals_integer()
.apply(Term::var("h")) .apply(Term::var("h"))
.apply(Term::var("h")) .apply(Term::var("h")),
.delay(),
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
) )
.force()
.lambda("h") .lambda("h")
.apply(Term::un_i_data().apply(Term::var("__var"))) .apply(Term::un_i_data().apply(Term::var("__var")))
.delay(), .delay(),
@ -5242,10 +5167,8 @@ fn expect_head_cast_data_no_tail() {
Constant::Data(Data::integer(1.into())), Constant::Data(Data::integer(1.into())),
Constant::Data(Data::integer(2.into())), Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())), Constant::Data(Data::integer(3.into())),
]))) ]))),
.delay(),
) )
.force()
.delay(), .delay(),
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
@ -5270,6 +5193,7 @@ fn expect_head_cast_data_with_tail() {
h == h && j == j h == h && j == j
} }
"#; "#;
let expect_on_list = Term::var("expect_on_list") let expect_on_list = Term::var("expect_on_list")
.apply(Term::var("expect_on_list")) .apply(Term::var("expect_on_list"))
.apply(Term::var("__list")) .apply(Term::var("__list"))
@ -5305,19 +5229,16 @@ fn expect_head_cast_data_with_tail() {
let check_with = Term::var("__list") let check_with = Term::var("__list")
.delayed_choose_list( .delayed_choose_list(
then, then,
Term::var("__head") Term::choose_data_integer(
.choose_data( Name::text("__head").into(),
Term::var("expect[h,j,..]:List<Int>=a"), |v| {
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("__curried_expect_on_list") Term::var("__curried_expect_on_list")
.apply(Term::tail_list().apply(Term::var("__list"))) .apply(Term::tail_list().apply(Term::var("__list")))
.lambda("_") .lambda("_")
.apply(Term::un_i_data().apply(Term::var("__head"))) .apply(v)
.delay(), },
Term::var("expect[h,j,..]:List<Int>=a"), &Term::var("expect[h,j,..]:List<Int>=a"),
) )
.force()
.lambda("__head") .lambda("__head")
.apply(Term::head_list().apply(Term::var("__list"))), .apply(Term::head_list().apply(Term::var("__list"))),
) )
@ -5325,9 +5246,7 @@ fn expect_head_cast_data_with_tail() {
.lambda("__list") .lambda("__list")
.lambda("__no_inline__"); .lambda("__no_inline__");
let on_list = values let on_list = values.clone().delay_filled_choose_list(
.clone()
.choose_list(
Term::var("expect[h,j,..]:List<Int>=a"), Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("__val") Term::var("__val")
.choose_data( .choose_data(
@ -5335,7 +5254,7 @@ fn expect_head_cast_data_with_tail() {
Term::var("expect[h,j,..]:List<Int>=a"), Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"), Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("tail_1") Term::var("tail_1")
.choose_list( .delay_filled_choose_list(
Term::var("expect[h,j,..]:List<Int>=a"), Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("__val") Term::var("__val")
.choose_data( .choose_data(
@ -5354,10 +5273,8 @@ fn expect_head_cast_data_with_tail() {
) )
.force() .force()
.lambda("__val") .lambda("__val")
.apply(Term::head_list().apply(Term::var("tail_1"))) .apply(Term::head_list().apply(Term::var("tail_1"))),
.delay(),
) )
.force()
.lambda("tail_1") .lambda("tail_1")
.apply(Term::tail_list().apply(values.clone())) .apply(Term::tail_list().apply(values.clone()))
.lambda("h") .lambda("h")
@ -5367,23 +5284,16 @@ fn expect_head_cast_data_with_tail() {
) )
.force() .force()
.lambda("__val") .lambda("__val")
.apply(Term::head_list().apply(values)) .apply(Term::head_list().apply(values)),
.delay(), );
)
.force()
.delay();
assert_uplc( assert_uplc(
src, src,
Term::var("__val") Term::choose_data_list(
.choose_data( Name::text("__val").into(),
Term::var("expect[h,j,..]:List<Int>=a"), |_| on_list,
Term::var("expect[h,j,..]:List<Int>=a"), &Term::var("expect[h,j,..]:List<Int>=a"),
on_list,
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
) )
.force()
.lambda("__val") .lambda("__val")
.apply(Term::data(Data::list(vec![ .apply(Term::data(Data::list(vec![
Data::integer(1.into()), Data::integer(1.into()),
@ -5539,21 +5449,19 @@ fn list_clause_with_assign() {
.delayed_choose_list( .delayed_choose_list(
Term::var("self"), Term::var("self"),
Term::var("tail_2") Term::var("tail_2")
.choose_list( .delay_empty_choose_list(
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply( .apply(
Term::var(CONSTR_INDEX_EXPOSER) Term::var(CONSTR_INDEX_EXPOSER)
.apply(Term::var("n")), .apply(Term::var("n")),
) )
.if_then_else( .delay_true_if_then_else(
Term::mk_cons() Term::mk_cons()
.apply(Term::var("n")) .apply(Term::var("n"))
.apply(Term::empty_list()) .apply(Term::empty_list()),
.delay(),
Term::var("clauses_delayed"), Term::var("clauses_delayed"),
) )
.force()
.lambda("x") .lambda("x")
.apply( .apply(
Term::head_list() Term::head_list()
@ -5563,11 +5471,9 @@ fn list_clause_with_assign() {
.apply( .apply(
Term::head_list() Term::head_list()
.apply(Term::var("self")), .apply(Term::var("self")),
) ),
.delay(),
Term::var("clauses_delayed"), Term::var("clauses_delayed"),
) )
.force()
.lambda("clauses_delayed") .lambda("clauses_delayed")
.apply( .apply(
Term::var("tail_2") Term::var("tail_2")
@ -5662,10 +5568,8 @@ fn opaque_value_in_datum() {
let expect_on_tail = Term::tail_list() let expect_on_tail = Term::tail_list()
.apply(Term::var("tail_1")) .apply(Term::var("tail_1"))
.choose_list( .delay_empty_choose_list(
Term::unit() Term::unit().lambda("_").apply(
.lambda("_")
.apply(
Term::var("expect_on_list").apply(Term::var("a")).apply( Term::var("expect_on_list").apply(Term::var("a")).apply(
Term::var("expect_on_list") Term::var("expect_on_list")
.apply(Term::var("pair_snd_outer")) .apply(Term::var("pair_snd_outer"))
@ -5727,11 +5631,9 @@ fn opaque_value_in_datum() {
) )
.lambda("pair_outer"), .lambda("pair_outer"),
), ),
) ),
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) )
.force()
.lambda("a") .lambda("a")
.apply( .apply(
Term::var("__val") Term::var("__val")
@ -5750,11 +5652,11 @@ fn opaque_value_in_datum() {
assert_uplc( assert_uplc(
src, src,
Term::var("val") Term::var("val")
.choose_list( .delay_filled_choose_list(
Term::var("expect[Pair(_,amount)]=val.inner.inner"), Term::var("expect[Pair(_,amount)]=val.inner.inner"),
Term::tail_list() Term::tail_list()
.apply(Term::var("val")) .apply(Term::var("val"))
.choose_list( .delay_empty_choose_list(
Term::equals_data() Term::equals_data()
.apply(Term::map_data().apply(Term::var("final_amount"))) .apply(Term::map_data().apply(Term::var("final_amount")))
.apply(Term::map_data().apply(Term::var("amount"))) .apply(Term::map_data().apply(Term::var("amount")))
@ -5769,16 +5671,12 @@ fn opaque_value_in_datum() {
.apply( .apply(
Term::unmap_data() Term::unmap_data()
.apply(Term::snd_pair().apply(Term::var("tuple_item_0"))), .apply(Term::snd_pair().apply(Term::var("tuple_item_0"))),
) ),
.delay(),
Term::var("expect[Pair(_,amount)]=val.inner.inner"), Term::var("expect[Pair(_,amount)]=val.inner.inner"),
) )
.force()
.lambda("tuple_item_0") .lambda("tuple_item_0")
.apply(Term::head_list().apply(Term::var("val"))) .apply(Term::head_list().apply(Term::var("val"))),
.delay(),
) )
.force()
.lambda("val") .lambda("val")
.apply( .apply(
Term::unmap_data().apply( Term::unmap_data().apply(
@ -5804,16 +5702,15 @@ fn opaque_value_in_datum() {
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply(Term::var("subject")) .apply(Term::var("subject"))
.if_then_else( .delay_true_if_then_else(
Term::var("dat_fields") Term::var("dat_fields")
.choose_list( .delay_filled_choose_list(
Term::var("param_msg"), Term::var("param_msg"),
Term::var("tail_1") Term::var("tail_1")
.choose_list( .delay_filled_choose_list(
Term::var("param_msg"), Term::var("param_msg"),
expect_on_tail.delay(), expect_on_tail,
) )
.force()
.lambda("tail_1") .lambda("tail_1")
.apply(Term::tail_list().apply(Term::var("dat_fields"))) .apply(Term::tail_list().apply(Term::var("dat_fields")))
.lambda("c") .lambda("c")
@ -5834,19 +5731,15 @@ fn opaque_value_in_datum() {
Term::head_list() Term::head_list()
.apply(Term::var("dat_fields")), .apply(Term::var("dat_fields")),
), ),
),
) )
.delay(),
)
.force()
.lambda("dat_fields") .lambda("dat_fields")
.apply( .apply(
Term::var(CONSTR_FIELDS_EXPOSER) Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("param_0")), .apply(Term::var("param_0")),
) ),
.delay(),
Term::var("param_msg"), Term::var("param_msg"),
) )
.force()
.lambda("subject") .lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("param_0"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("param_0")))
.lambda("param_msg") .lambda("param_msg")
@ -5951,11 +5844,11 @@ fn opaque_value_in_test() {
assert_uplc( assert_uplc(
src, src,
Term::var("val") Term::var("val")
.choose_list( .delay_filled_choose_list(
Term::var("expect[Pair(_,amount)]=val.inner.inner"), Term::var("expect[Pair(_,amount)]=val.inner.inner"),
Term::tail_list() Term::tail_list()
.apply(Term::var("val")) .apply(Term::var("val"))
.choose_list( .delay_empty_choose_list(
Term::equals_data() Term::equals_data()
.apply(Term::map_data().apply(Term::var("final_amount"))) .apply(Term::map_data().apply(Term::var("final_amount")))
.apply(Term::map_data().apply(Term::var("amount"))) .apply(Term::map_data().apply(Term::var("amount")))
@ -5970,16 +5863,12 @@ fn opaque_value_in_test() {
.apply( .apply(
Term::unmap_data() Term::unmap_data()
.apply(Term::snd_pair().apply(Term::var("tuple_item_0"))), .apply(Term::snd_pair().apply(Term::var("tuple_item_0"))),
) ),
.delay(),
Term::var("expect[Pair(_,amount)]=val.inner.inner"), Term::var("expect[Pair(_,amount)]=val.inner.inner"),
) )
.force()
.lambda("tuple_item_0") .lambda("tuple_item_0")
.apply(Term::head_list().apply(Term::var("val"))) .apply(Term::head_list().apply(Term::var("val"))),
.delay(),
) )
.force()
.lambda("val") .lambda("val")
.apply(Term::unmap_data().apply(Term::head_list().apply( .apply(Term::unmap_data().apply(Term::head_list().apply(
Term::tail_list().apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))), Term::tail_list().apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))),
@ -6138,13 +6027,13 @@ fn tuple_2_match() {
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("tuple_index_0"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("tuple_index_0")))
.if_then_else( .delay_true_if_then_else(
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply( .apply(
Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("tuple_index_1")), Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("tuple_index_1")),
) )
.if_then_else( .delay_true_if_then_else(
Term::equals_integer() Term::equals_integer()
.apply( .apply(
Term::subtract_integer() Term::subtract_integer()
@ -6182,11 +6071,9 @@ fn tuple_2_match() {
.apply( .apply(
Term::var(CONSTR_FIELDS_EXPOSER) Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("tuple_index_1")), .apply(Term::var("tuple_index_1")),
) ),
.delay(),
Term::var("clauses_delayed"), Term::var("clauses_delayed"),
) )
.force()
.lambda("x1") .lambda("x1")
.apply( .apply(
Term::un_i_data() Term::un_i_data()
@ -6208,11 +6095,9 @@ fn tuple_2_match() {
.lambda("tuple_index_0_fields") .lambda("tuple_index_0_fields")
.apply( .apply(
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("tuple_index_0")), Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("tuple_index_0")),
) ),
.delay(),
Term::var("clauses_delayed"), Term::var("clauses_delayed"),
) )
.force()
.lambda("clauses_delayed") .lambda("clauses_delayed")
.apply( .apply(
Term::equals_integer() Term::equals_integer()
@ -6220,22 +6105,19 @@ fn tuple_2_match() {
.apply( .apply(
Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("tuple_index_0")), Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("tuple_index_0")),
) )
.if_then_else( .delay_true_if_then_else(
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(1.into())) .apply(Term::integer(1.into()))
.apply( .apply(
Term::var(CONSTR_INDEX_EXPOSER) Term::var(CONSTR_INDEX_EXPOSER)
.apply(Term::var("tuple_index_1")), .apply(Term::var("tuple_index_1")),
) )
.if_then_else( .delay_true_if_then_else(
Term::bool(true).delay(), Term::bool(true),
Term::var("clauses_delayed"),
),
Term::var("clauses_delayed"), Term::var("clauses_delayed"),
) )
.force()
.delay(),
Term::var("clauses_delayed"),
)
.force()
.lambda("clauses_delayed") .lambda("clauses_delayed")
.apply( .apply(
Term::equals_integer() Term::equals_integer()
@ -6244,22 +6126,19 @@ fn tuple_2_match() {
Term::var(CONSTR_INDEX_EXPOSER) Term::var(CONSTR_INDEX_EXPOSER)
.apply(Term::var("tuple_index_0")), .apply(Term::var("tuple_index_0")),
) )
.if_then_else( .delay_true_if_then_else(
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply( .apply(
Term::var(CONSTR_INDEX_EXPOSER) Term::var(CONSTR_INDEX_EXPOSER)
.apply(Term::var("tuple_index_1")), .apply(Term::var("tuple_index_1")),
) )
.if_then_else( .delay_true_if_then_else(
Term::bool(false).delay(), Term::bool(false),
Term::var("clauses_delayed"),
),
Term::var("clauses_delayed"), Term::var("clauses_delayed"),
) )
.force()
.delay(),
Term::var("clauses_delayed"),
)
.force()
.lambda("clauses_delayed") .lambda("clauses_delayed")
.apply(Term::bool(false).delay()) .apply(Term::bool(false).delay())
.delay(), .delay(),