done with data builtins

This commit is contained in:
Kasey White 2022-08-28 04:17:29 -04:00 committed by Kasey White
parent 368cd4ad55
commit 833914c80c
2 changed files with 37 additions and 5 deletions

View File

@ -819,7 +819,24 @@ impl BuiltinCosts {
mem: self.null_list.mem.cost(args[0].to_ex_mem()), mem: self.null_list.mem.cost(args[0].to_ex_mem()),
cpu: self.null_list.cpu.cost(args[0].to_ex_mem()), cpu: self.null_list.cpu.cost(args[0].to_ex_mem()),
}, },
DefaultFunction::ChooseData => todo!(), DefaultFunction::ChooseData => ExBudget {
mem: self.choose_data.mem.cost(
args[0].to_ex_mem(),
args[1].to_ex_mem(),
args[2].to_ex_mem(),
args[3].to_ex_mem(),
args[4].to_ex_mem(),
args[5].to_ex_mem(),
),
cpu: self.choose_data.cpu.cost(
args[0].to_ex_mem(),
args[1].to_ex_mem(),
args[2].to_ex_mem(),
args[3].to_ex_mem(),
args[4].to_ex_mem(),
args[5].to_ex_mem(),
),
},
DefaultFunction::ConstrData => ExBudget { DefaultFunction::ConstrData => ExBudget {
mem: self mem: self
.constr_data .constr_data

View File

@ -115,7 +115,7 @@ impl DefaultFunction {
DefaultFunction::HeadList => 1, DefaultFunction::HeadList => 1,
DefaultFunction::TailList => 1, DefaultFunction::TailList => 1,
DefaultFunction::NullList => 1, DefaultFunction::NullList => 1,
DefaultFunction::ChooseData => todo!(), DefaultFunction::ChooseData => 6,
DefaultFunction::ConstrData => 2, DefaultFunction::ConstrData => 2,
DefaultFunction::MapData => 1, DefaultFunction::MapData => 1,
DefaultFunction::ListData => 1, DefaultFunction::ListData => 1,
@ -174,7 +174,7 @@ impl DefaultFunction {
DefaultFunction::HeadList => 1, DefaultFunction::HeadList => 1,
DefaultFunction::TailList => 1, DefaultFunction::TailList => 1,
DefaultFunction::NullList => 1, DefaultFunction::NullList => 1,
DefaultFunction::ChooseData => todo!(), DefaultFunction::ChooseData => 1,
DefaultFunction::ConstrData => 0, DefaultFunction::ConstrData => 0,
DefaultFunction::MapData => 0, DefaultFunction::MapData => 0,
DefaultFunction::ListData => 0, DefaultFunction::ListData => 0,
@ -277,7 +277,13 @@ impl DefaultFunction {
DefaultFunction::HeadList => arg.expect_list(), DefaultFunction::HeadList => arg.expect_list(),
DefaultFunction::TailList => arg.expect_list(), DefaultFunction::TailList => arg.expect_list(),
DefaultFunction::NullList => arg.expect_list(), DefaultFunction::NullList => arg.expect_list(),
DefaultFunction::ChooseData => todo!(), DefaultFunction::ChooseData => {
if args.is_empty() {
arg.expect_type(Type::Data)
} else {
Ok(())
}
}
DefaultFunction::ConstrData => { DefaultFunction::ConstrData => {
if args.is_empty() { if args.is_empty() {
arg.expect_type(Type::Integer) arg.expect_type(Type::Integer)
@ -633,7 +639,15 @@ impl DefaultFunction {
} }
_ => unreachable!(), _ => unreachable!(),
}, },
DefaultFunction::ChooseData => todo!(), DefaultFunction::ChooseData => match &args[0] {
Value::Con(Constant::Data(PlutusData::Constr(_))) => Ok(args[1].clone()),
Value::Con(Constant::Data(PlutusData::Map(_))) => Ok(args[2].clone()),
Value::Con(Constant::Data(PlutusData::Array(_)))
| Value::Con(Constant::Data(PlutusData::ArrayIndef(_))) => Ok(args[3].clone()),
Value::Con(Constant::Data(PlutusData::BigInt(_))) => Ok(args[4].clone()),
Value::Con(Constant::Data(PlutusData::BoundedBytes(_))) => Ok(args[5].clone()),
_ => unreachable!(),
},
DefaultFunction::ConstrData => match (&args[0], &args[1]) { DefaultFunction::ConstrData => match (&args[0], &args[1]) {
( (
Value::Con(Constant::Integer(i)), Value::Con(Constant::Integer(i)),
@ -648,6 +662,7 @@ impl DefaultFunction {
.collect(); .collect();
let constr_data = PlutusData::Constr(Constr { let constr_data = PlutusData::Constr(Constr {
// TODO: handle other types of constructor tags
tag: (*i as u64) + 121, tag: (*i as u64) + 121,
any_constructor: None, any_constructor: None,
fields: MaybeIndefArray::Indef(data_list), fields: MaybeIndefArray::Indef(data_list),