aboutsummaryrefslogtreecommitdiff
path: root/src/checker_signature.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/checker_signature.rs')
-rw-r--r--src/checker_signature.rs30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/checker_signature.rs b/src/checker_signature.rs
index 8e99d3c..bf04308 100644
--- a/src/checker_signature.rs
+++ b/src/checker_signature.rs
@@ -241,8 +241,34 @@ impl CheckerState {
Box::new(element),
))
}
- Instance::For { .. } => {
- todo!("app for")
+ Instance::For { params, body } => {
+ if params.is_empty() {
+ panic!(
+ "It should have been impossible to construct a For with no params, but here we are"
+ );
+ }
+ let mut ctx = self.clone();
+ for (idx, param) in params.iter().enumerate() {
+ let Param {
+ name: param_name,
+ set: param_set,
+ } = param.clone();
+ if idx == 0 {
+ let element = self.check_element(&*element, &param_set)?;
+ ctx.make_element_definition(param_name, element, param_set)?;
+ } else {
+ ctx.make_element_binding(param_name, param_set)?;
+ }
+ }
+ let instance = ctx.check_instance(body, signature)?;
+ if params.len() == 1 {
+ Ok(instance)
+ } else {
+ Ok(Instance::For {
+ params: params[1..].iter().map(|p| p.clone()).collect(),
+ body: Box::new(instance),
+ })
+ }
}
Instance::Record(_) | Instance::SetCoerce(_) => {
Err(CheckerError::NonFunctionalInstance {