remove wild card match from tree functions
Start working on supporting Pair clauses
This commit is contained in:
parent
f950ae7d3d
commit
21b60896f0
|
@ -95,6 +95,7 @@ pub enum SpecificClause {
|
||||||
TupleClause {
|
TupleClause {
|
||||||
defined_tuple_indices: IndexSet<(usize, String)>,
|
defined_tuple_indices: IndexSet<(usize, String)>,
|
||||||
},
|
},
|
||||||
|
PairClause,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ClauseProperties {
|
impl ClauseProperties {
|
||||||
|
@ -112,7 +113,7 @@ impl ClauseProperties {
|
||||||
checked_index: -1,
|
checked_index: -1,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
} else if t.is_tuple() || t.is_pair() {
|
} else if t.is_tuple() {
|
||||||
ClauseProperties {
|
ClauseProperties {
|
||||||
clause_var_name: constr_var,
|
clause_var_name: constr_var,
|
||||||
complex_clause: false,
|
complex_clause: false,
|
||||||
|
@ -123,6 +124,15 @@ impl ClauseProperties {
|
||||||
defined_tuple_indices: IndexSet::new(),
|
defined_tuple_indices: IndexSet::new(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
} else if t.is_pair() {
|
||||||
|
ClauseProperties {
|
||||||
|
clause_var_name: constr_var,
|
||||||
|
complex_clause: false,
|
||||||
|
original_subject_name: subject_name,
|
||||||
|
needs_constr_var: false,
|
||||||
|
final_clause: false,
|
||||||
|
specific_clause: SpecificClause::PairClause,
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ClauseProperties {
|
ClauseProperties {
|
||||||
clause_var_name: constr_var,
|
clause_var_name: constr_var,
|
||||||
|
@ -154,7 +164,7 @@ impl ClauseProperties {
|
||||||
checked_index: -1,
|
checked_index: -1,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
} else if t.is_tuple() || t.is_pair() {
|
} else if t.is_tuple() {
|
||||||
ClauseProperties {
|
ClauseProperties {
|
||||||
clause_var_name: constr_var,
|
clause_var_name: constr_var,
|
||||||
complex_clause: false,
|
complex_clause: false,
|
||||||
|
@ -165,6 +175,15 @@ impl ClauseProperties {
|
||||||
defined_tuple_indices: IndexSet::new(),
|
defined_tuple_indices: IndexSet::new(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
} else if t.is_pair() {
|
||||||
|
ClauseProperties {
|
||||||
|
clause_var_name: constr_var,
|
||||||
|
complex_clause: false,
|
||||||
|
original_subject_name: subject_name,
|
||||||
|
needs_constr_var: false,
|
||||||
|
final_clause,
|
||||||
|
specific_clause: SpecificClause::PairClause,
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ClauseProperties {
|
ClauseProperties {
|
||||||
clause_var_name: constr_var,
|
clause_var_name: constr_var,
|
||||||
|
@ -985,7 +1004,7 @@ pub fn unknown_data_to_type(term: Term<Name>, field_type: &Type) -> Term<Name> {
|
||||||
Term::unmap_data().apply(term)
|
Term::unmap_data().apply(term)
|
||||||
} else if field_type.is_string() {
|
} else if field_type.is_string() {
|
||||||
Term::Builtin(DefaultFunction::DecodeUtf8).apply(Term::un_b_data().apply(term))
|
Term::Builtin(DefaultFunction::DecodeUtf8).apply(Term::un_b_data().apply(term))
|
||||||
} else if field_type.is_tuple() && matches!(field_type.get_uplc_type(), UplcType::Pair(_, _)) {
|
} else if field_type.is_pair() {
|
||||||
Term::tail_list()
|
Term::tail_list()
|
||||||
.apply(Term::tail_list().apply(Term::var("__list_data")))
|
.apply(Term::tail_list().apply(Term::var("__list_data")))
|
||||||
.delayed_choose_list(
|
.delayed_choose_list(
|
||||||
|
@ -1410,7 +1429,7 @@ pub fn list_access_to_uplc(
|
||||||
let head_item = |name, tipo: &Rc<Type>, tail_name: &str| {
|
let head_item = |name, tipo: &Rc<Type>, tail_name: &str| {
|
||||||
if name == "_" {
|
if name == "_" {
|
||||||
Term::unit()
|
Term::unit()
|
||||||
} else if matches!(tipo.get_uplc_type(), UplcType::Pair(_, _)) && is_list_accessor {
|
} else if tipo.is_pair() && is_list_accessor {
|
||||||
Term::head_list().apply(Term::var(tail_name.to_string()))
|
Term::head_list().apply(Term::var(tail_name.to_string()))
|
||||||
} else if matches!(expect_level, ExpectLevel::Full) {
|
} else if matches!(expect_level, ExpectLevel::Full) {
|
||||||
// Expect level is full so we have an unknown piece of data to cast
|
// Expect level is full so we have an unknown piece of data to cast
|
||||||
|
|
|
@ -1645,18 +1645,18 @@ impl AirTree {
|
||||||
match self {
|
match self {
|
||||||
AirTree::ClauseGuard { subject_tipo, .. }
|
AirTree::ClauseGuard { subject_tipo, .. }
|
||||||
| AirTree::ListClauseGuard { subject_tipo, .. }
|
| AirTree::ListClauseGuard { subject_tipo, .. }
|
||||||
| AirTree::TupleGuard { subject_tipo, .. } => vec![subject_tipo],
|
| AirTree::PairGuard { subject_tipo, .. }
|
||||||
|
| AirTree::TupleGuard { subject_tipo, .. }
|
||||||
|
| AirTree::Clause { subject_tipo, .. }
|
||||||
|
| AirTree::ListClause { subject_tipo, .. }
|
||||||
|
| AirTree::TupleClause { subject_tipo, .. }
|
||||||
|
| AirTree::PairClause { subject_tipo, .. } => vec![subject_tipo],
|
||||||
|
|
||||||
AirTree::ListAccessor { tipo, .. }
|
AirTree::ListAccessor { tipo, .. }
|
||||||
| AirTree::ListExpose { tipo, .. }
|
| AirTree::ListExpose { tipo, .. }
|
||||||
| AirTree::TupleAccessor { tipo, .. } => vec![tipo],
|
| AirTree::TupleAccessor { tipo, .. }
|
||||||
AirTree::FieldsExpose { indices, .. } => {
|
| AirTree::PairAccessor { tipo, .. }
|
||||||
let mut types = vec![];
|
| AirTree::List { tipo, .. }
|
||||||
for (_, _, tipo) in indices {
|
|
||||||
types.push(tipo);
|
|
||||||
}
|
|
||||||
types
|
|
||||||
}
|
|
||||||
AirTree::List { tipo, .. }
|
|
||||||
| AirTree::Tuple { tipo, .. }
|
| AirTree::Tuple { tipo, .. }
|
||||||
| AirTree::Call { tipo, .. }
|
| AirTree::Call { tipo, .. }
|
||||||
| AirTree::Builtin { tipo, .. }
|
| AirTree::Builtin { tipo, .. }
|
||||||
|
@ -1665,7 +1665,17 @@ impl AirTree {
|
||||||
| AirTree::If { tipo, .. }
|
| AirTree::If { tipo, .. }
|
||||||
| AirTree::Constr { tipo, .. }
|
| AirTree::Constr { tipo, .. }
|
||||||
| AirTree::ErrorTerm { tipo, .. }
|
| AirTree::ErrorTerm { tipo, .. }
|
||||||
| AirTree::Trace { tipo, .. } => vec![tipo],
|
| AirTree::Trace { tipo, .. }
|
||||||
|
| AirTree::Pair { tipo, .. } => vec![tipo],
|
||||||
|
|
||||||
|
AirTree::FieldsExpose { indices, .. } => {
|
||||||
|
let mut types = vec![];
|
||||||
|
for (_, _, tipo) in indices {
|
||||||
|
types.push(tipo);
|
||||||
|
}
|
||||||
|
types
|
||||||
|
}
|
||||||
|
|
||||||
AirTree::Var { constructor, .. } => {
|
AirTree::Var { constructor, .. } => {
|
||||||
vec![constructor.tipo.borrow_mut()]
|
vec![constructor.tipo.borrow_mut()]
|
||||||
}
|
}
|
||||||
|
@ -1679,9 +1689,7 @@ impl AirTree {
|
||||||
AirTree::When {
|
AirTree::When {
|
||||||
tipo, subject_tipo, ..
|
tipo, subject_tipo, ..
|
||||||
} => vec![tipo, subject_tipo],
|
} => vec![tipo, subject_tipo],
|
||||||
AirTree::Clause { subject_tipo, .. }
|
|
||||||
| AirTree::ListClause { subject_tipo, .. }
|
|
||||||
| AirTree::TupleClause { subject_tipo, .. } => vec![subject_tipo],
|
|
||||||
AirTree::RecordUpdate { tipo, indices, .. } => {
|
AirTree::RecordUpdate { tipo, indices, .. } => {
|
||||||
let mut types = vec![tipo];
|
let mut types = vec![tipo];
|
||||||
for (_, tipo) in indices {
|
for (_, tipo) in indices {
|
||||||
|
@ -1689,9 +1697,24 @@ impl AirTree {
|
||||||
}
|
}
|
||||||
types
|
types
|
||||||
}
|
}
|
||||||
_ => {
|
AirTree::Let { .. }
|
||||||
vec![]
|
| AirTree::DefineFunc { .. }
|
||||||
}
|
| AirTree::DefineCyclicFuncs { .. }
|
||||||
|
| AirTree::AssertConstr { .. }
|
||||||
|
| AirTree::AssertBool { .. }
|
||||||
|
| AirTree::FieldsEmpty { .. }
|
||||||
|
| AirTree::ListEmpty { .. }
|
||||||
|
| AirTree::NoOp { .. }
|
||||||
|
| AirTree::Int { .. }
|
||||||
|
| AirTree::String { .. }
|
||||||
|
| AirTree::ByteArray { .. }
|
||||||
|
| AirTree::CurvePoint { .. }
|
||||||
|
| AirTree::Bool { .. }
|
||||||
|
| AirTree::Void
|
||||||
|
| AirTree::Fn { .. }
|
||||||
|
| AirTree::UnOp { .. }
|
||||||
|
| AirTree::WrapClause { .. }
|
||||||
|
| AirTree::Finally { .. } => vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue