diff options
| author | tslil <tslil@posteo.de> | 2026-05-07 11:50:06 +0100 |
|---|---|---|
| committer | tslil <tslil@posteo.de> | 2026-05-07 13:34:30 +0100 |
| commit | 8d9c0e5868b2a7fa22080f814357dcda69a10057 (patch) | |
| tree | 5a49bfd66ea2e8d6ffeb425a7198bdb58fb3ec02 /src/checker_set.rs | |
| parent | d14c744a1cff323f8a837ef620a93ee518c392a2 (diff) | |
add complete lifted sets
Diffstat (limited to 'src/checker_set.rs')
| -rw-r--r-- | src/checker_set.rs | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/checker_set.rs b/src/checker_set.rs index f13f686..2f934e2 100644 --- a/src/checker_set.rs +++ b/src/checker_set.rs @@ -120,6 +120,17 @@ impl CheckerState { } Ok(element.clone().into()) } + Element::ClaimedElement(instance) => { + let instance = self.check_instance( + instance.as_ref(), + set.map(|s| Signature::FromSet(s.clone())).as_ref(), + )?; + if let Instance::ElementCoerce(element) = instance { + Ok(element) + } else { + Ok(Element::ClaimedElement(Box::new(instance))) + } + } Element::Var(v) => { let lookup = self.lookup_element(&v)?; @@ -275,12 +286,13 @@ impl CheckerState { match inner { // We're stuck on something that bottoms out in a binding // blocking computation, nothing to be done here - Element::Var(_) | Element::Project { .. } | Element::Case { .. } => { - Ok(Element::Project { - element: Box::new(inner), - field: field.clone(), - }) - } + Element::Var(_) + | Element::Project { .. } + | Element::Case { .. } + | Element::ClaimedElement(_) => Ok(Element::Project { + element: Box::new(inner), + field: field.clone(), + }), Element::Record(assignations) => { let sub_element = assignations .into_iter() @@ -382,7 +394,10 @@ impl CheckerState { } => Some((field.clone(), *inner.clone())), // These are all the cases which could become stuck on a // formal binding - Element::Var(_) | Element::Project { .. } | Element::Case { .. } => None, + Element::Var(_) + | Element::Project { .. } + | Element::Case { .. } + | Element::ClaimedElement(_) => None, Element::Literal(_) | Element::Record(_) => panic!( "invariant violation: scrutinee is a non-variant value at variant set" ), @@ -394,6 +409,7 @@ impl CheckerState { let posit_equality_with = match &scrutinee { Element::Var(v) => Some(v.clone()), Element::Inject { .. } + | Element::ClaimedElement(_) | Element::Project { .. } | Element::Case { .. } | Element::Literal(_) |
