aboutsummaryrefslogtreecommitdiff
path: root/src/checker_set.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/checker_set.rs')
-rw-r--r--src/checker_set.rs18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/checker_set.rs b/src/checker_set.rs
index 729ce08..86661c7 100644
--- a/src/checker_set.rs
+++ b/src/checker_set.rs
@@ -15,11 +15,7 @@ impl CheckerState {
.into_iter()
.map(|RecordField { name, set }| {
let set = ctx.check_set(set)?;
- ctx.add_element(
- name.clone(),
- Value::Hypothetical(set.clone()),
- set.clone(),
- )?;
+ ctx.make_element_binding(name.clone(), set.clone())?;
Ok(RecordField { name, set })
})
.collect::<Result<Vec<_>, _>>()?;
@@ -38,10 +34,16 @@ impl CheckerState {
.collect::<Result<Vec<_>, _>>()?;
Ok(Set::Variant(fields))
}
- Set::ClaimedSet(_) => Err(CheckerError::Unimplemented("instances as sets".to_string())),
+ Set::ClaimedSet(instance) => {
+ let instance = self.check_instance(instance, &Signature::Set)?;
+ Ok(Set::ClaimedSet(instance))
+ }
Set::Var(v) => {
let deref = self.lookup_set(&v)?;
- Ok(deref.clone())
+ match deref {
+ SetValue::Hypothetical => Ok(Set::Var(v)),
+ SetValue::Concrete(deref) => Ok(deref.clone()),
+ }
}
}
}
@@ -334,7 +336,7 @@ impl CheckerState {
} else {
new_context.add_element(
binding_name.clone(),
- Value::Hypothetical(field_set.clone()),
+ Value::Hypothetical,
binding_set,
)?;
new_context.check_element(arm.body.clone().into(), set)?