instantiate aliases with a function

This commit is contained in:
Folkert 2022-04-24 01:04:59 +02:00
parent f7010336bb
commit b0ceaf0372
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
2 changed files with 21 additions and 16 deletions

View file

@ -1966,13 +1966,12 @@ fn correct_mutual_recursive_type_alias<'a>(
// Don't try to instantiate the alias itself in its definition.
let original_alias_def = to_instantiate.remove(&rec).unwrap();
let helper = |s| to_instantiate.get(&s);
let mut new_lambda_sets = ImSet::default();
alias.typ.instantiate_aliases(
alias.region,
&to_instantiate,
var_store,
&mut new_lambda_sets,
);
alias
.typ
.instantiate_aliases(alias.region, &helper, var_store, &mut new_lambda_sets);
for lambda_set_var in new_lambda_sets {
alias

View file

@ -120,13 +120,15 @@ impl RecordField<Type> {
}
}
pub fn instantiate_aliases(
pub fn instantiate_aliases<'a, F>(
&mut self,
region: Region,
aliases: &ImMap<Symbol, Alias>,
aliases: &'a F,
var_store: &mut VarStore,
introduced: &mut ImSet<Variable>,
) {
) where
F: Fn(Symbol) -> Option<&'a Alias>,
{
use RecordField::*;
match self {
@ -168,13 +170,15 @@ impl LambdaSet {
&mut self.0
}
fn instantiate_aliases(
fn instantiate_aliases<'a, F>(
&mut self,
region: Region,
aliases: &ImMap<Symbol, Alias>,
aliases: &'a F,
var_store: &mut VarStore,
introduced: &mut ImSet<Variable>,
) {
) where
F: Fn(Symbol) -> Option<&'a Alias>,
{
self.0
.instantiate_aliases(region, aliases, var_store, introduced)
}
@ -1064,13 +1068,15 @@ impl Type {
result
}
pub fn instantiate_aliases(
pub fn instantiate_aliases<'a, F>(
&mut self,
region: Region,
aliases: &ImMap<Symbol, Alias>,
aliases: &'a F,
var_store: &mut VarStore,
new_lambda_set_variables: &mut ImSet<Variable>,
) {
) where
F: Fn(Symbol) -> Option<&'a Alias>,
{
use Type::*;
match self {
@ -1138,7 +1144,7 @@ impl Type {
);
}
Apply(symbol, args, _) => {
if let Some(alias) = aliases.get(symbol) {
if let Some(alias) = aliases(*symbol) {
// TODO switch to this, but we still need to check for recursion with the
// `else` branch
if false {