mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-02 08:11:12 +00:00
instantiate aliases with a function
This commit is contained in:
parent
f7010336bb
commit
b0ceaf0372
2 changed files with 21 additions and 16 deletions
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue