diff --git a/compiler/solve/src/solve.rs b/compiler/solve/src/solve.rs index efb7e836a6..a13aa88f96 100644 --- a/compiler/solve/src/solve.rs +++ b/compiler/solve/src/solve.rs @@ -78,25 +78,29 @@ pub enum TypeError { #[derive(Clone, Debug, Default)] pub struct Env { - vars_by_symbol: MutMap, + vars_by_symbol: Vec<(Symbol, Variable)>, } impl Env { pub fn vars_by_symbol(&self) -> MutMap { - self.vars_by_symbol.clone() + self.vars_by_symbol.iter().copied().collect() } fn get_var_by_symbol(&self, symbol: &Symbol) -> Option { - self.vars_by_symbol.get(symbol).copied() + self.vars_by_symbol + .iter() + .find(|(s, _)| s == symbol) + .map(|(_, var)| *var) } fn insert_symbol_var_if_vacant(&mut self, symbol: Symbol, var: Variable) { - match self.vars_by_symbol.entry(symbol) { - Entry::Occupied(_) => { - // keep the existing value + match self.get_var_by_symbol(&symbol) { + None => { + // symbol is not in vars_by_symbol yet; insert it + self.vars_by_symbol.push((symbol, var)) } - Entry::Vacant(vacant) => { - vacant.insert(var); + Some(_) => { + // do nothing } } } diff --git a/reporting/tests/helpers/mod.rs b/reporting/tests/helpers/mod.rs index 544c440164..0485f9da9d 100644 --- a/reporting/tests/helpers/mod.rs +++ b/reporting/tests/helpers/mod.rs @@ -31,10 +31,7 @@ pub fn infer_expr( constraint: &Constraint, expr_var: Variable, ) -> (Content, Subs) { - let env = solve::Env { - aliases: MutMap::default(), - vars_by_symbol: MutMap::default(), - }; + let env = solve::Env::default(); let (solved, _) = solve::run(&env, problems, subs, constraint); let content = solved