diff options
| -rw-r--r-- | src/checker_signature.rs | 30 |
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, ¶m_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 { |
