diff --git a/crates/aiken-lang/src/gen_uplc/builder.rs b/crates/aiken-lang/src/gen_uplc/builder.rs index a52bb5af..634d5709 100644 --- a/crates/aiken-lang/src/gen_uplc/builder.rs +++ b/crates/aiken-lang/src/gen_uplc/builder.rs @@ -962,17 +962,40 @@ pub fn convert_constants_to_data(constants: Vec>) -> Vec { - let inner_constants = - convert_constants_to_data(constants.iter().cloned().map(Rc::new).collect()) - .into_iter() - .map(|constant| match constant { - UplcConstant::Data(d) => d, - _ => todo!(), + UplcConstant::ProtoList(list_type, constants) => { + if matches!(list_type, UplcType::Pair(_, _)) { + let inner_constants = constants + .iter() + .cloned() + .map(|pair| match pair { + UplcConstant::ProtoPair(_, _, left, right) => { + let inner_constants = vec![left, right]; + let inner_constants = convert_constants_to_data(inner_constants) + .into_iter() + .map(|constant| match constant { + UplcConstant::Data(d) => d, + _ => todo!(), + }) + .collect_vec(); + (inner_constants[0].clone(), inner_constants[1].clone()) + } + _ => unreachable!(), }) .collect_vec(); - UplcConstant::Data(PlutusData::Array(inner_constants)) + UplcConstant::Data(PlutusData::Map(KeyValuePairs::Def(inner_constants))) + } else { + let inner_constants = + convert_constants_to_data(constants.iter().cloned().map(Rc::new).collect()) + .into_iter() + .map(|constant| match constant { + UplcConstant::Data(d) => d, + _ => todo!(), + }) + .collect_vec(); + + UplcConstant::Data(PlutusData::Array(inner_constants)) + } } UplcConstant::ProtoPair(_, _, left, right) => { let inner_constants = vec![left.clone(), right.clone()]; @@ -984,10 +1007,10 @@ pub fn convert_constants_to_data(constants: Vec>) -> Vec d.clone(), UplcConstant::Unit => UplcConstant::Data(PlutusData::Constr(Constr { @@ -1540,7 +1563,7 @@ pub fn handle_func_dependencies( .unwrap_or_else(|| unreachable!()); if (dep_scope.common_ancestor(func_scope) == *func_scope && !depend_comp.args.is_empty()) - || function_component.args.is_empty() + || (function_component.args.is_empty() && !depend_comp.args.is_empty()) { let mut recursion_ir = vec![]; handle_recursion_ir(&dependency, depend_comp, &mut recursion_ir); diff --git a/examples/acceptance_tests/082/aiken.lock b/examples/acceptance_tests/082/aiken.lock new file mode 100644 index 00000000..0423f31b --- /dev/null +++ b/examples/acceptance_tests/082/aiken.lock @@ -0,0 +1,13 @@ +# This file was generated by Aiken +# You typically do not need to edit this file + +[[requirements]] +name = "aiken-lang/stdlib" +version = "main" +source = "github" + +[[packages]] +name = "aiken-lang/stdlib" +version = "main" +requirements = [] +source = "github" diff --git a/examples/acceptance_tests/082/aiken.toml b/examples/acceptance_tests/082/aiken.toml new file mode 100644 index 00000000..6b46440e --- /dev/null +++ b/examples/acceptance_tests/082/aiken.toml @@ -0,0 +1,8 @@ +name = "aiken-lang/acceptance_test_082" +version = "0.0.0" +description = "" + +[[dependencies]] +name = 'aiken-lang/stdlib' +version = 'main' +source = 'github' diff --git a/examples/acceptance_tests/082/lib/tests.ak b/examples/acceptance_tests/082/lib/tests.ak new file mode 100644 index 00000000..4a9b4f81 --- /dev/null +++ b/examples/acceptance_tests/082/lib/tests.ak @@ -0,0 +1,29 @@ +use aiken/list +use aiken/transaction/value.{Value} + +test foldl_value_test1() { + let val1 = value.from_lovelace(1000000) + let val2 = value.from_lovelace(2000000) + let foo = + fn(i: Value, acc: (Value, Int)) { + let (v, int) = acc + (value.add(i, v), int + 1) + } + list.foldl([val1, val2], foo, (value.zero(), 0)) == ( + value.from_lovelace(3000000), + 2, + ) +} +// test foldl_value_test2() { +// let val1 = value.from_lovelace(1000000) +// let val2 = value.from_lovelace(2000000) +// let foo = +// fn(i: Value, acc: (Value, Int)) { +// let (v, int) = acc +// (value.add(i, v), int + 1) +// } +// list.foldl([val1, val2], foo, (value.from_lovelace(0), 0)) == ( +// value.from_lovelace(3000000), +// 2, +// ) +// }