Skip to content

Commit c1c7f58

Browse files
authored
Merge pull request #476 from zaharidichev/zd/use-chain-filter-in-clauses-for-goal
Use chain and filter instead of extending a vec in program_clauses_fo…
2 parents d414743 + 69d6dcc commit c1c7f58

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

chalk-solve/src/clauses.rs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -121,21 +121,23 @@ pub(crate) fn program_clauses_for_goal<'db, I: Interner>(
121121
);
122122
let interner = db.interner();
123123

124-
// FIXME: change this to use `.chain().filter()`
125-
let mut vec = vec![];
126-
vec.extend(db.custom_clauses());
127-
program_clauses_that_could_match(db, environment, goal, &mut vec)?;
128-
vec.retain(|c| c.could_match(interner, goal));
129-
vec.extend(
130-
db.program_clauses_for_env(environment)
131-
.iter(interner)
132-
.filter(|c| (*c).could_match(interner, goal))
133-
.cloned(),
134-
);
124+
let custom_clauses = db.custom_clauses().into_iter();
125+
let clauses_that_could_match =
126+
program_clauses_that_could_match(db, environment, goal).map(|cl| cl.into_iter())?;
127+
128+
let clauses: Vec<ProgramClause<I>> = custom_clauses
129+
.chain(clauses_that_could_match)
130+
.chain(
131+
db.program_clauses_for_env(environment)
132+
.iter(interner)
133+
.cloned(),
134+
)
135+
.filter(|c| c.could_match(interner, goal))
136+
.collect();
135137

136-
debug!("vec = {:#?}", vec);
138+
debug!("vec = {:#?}", clauses);
137139

138-
Ok(vec)
140+
Ok(clauses)
139141
}
140142

141143
/// Returns a set of program clauses that could possibly match
@@ -146,10 +148,10 @@ fn program_clauses_that_could_match<I: Interner>(
146148
db: &dyn RustIrDatabase<I>,
147149
environment: &Environment<I>,
148150
goal: &DomainGoal<I>,
149-
clauses: &mut Vec<ProgramClause<I>>,
150-
) -> Result<(), Floundered> {
151+
) -> Result<Vec<ProgramClause<I>>, Floundered> {
151152
let interner = db.interner();
152-
let builder = &mut ClauseBuilder::new(db, clauses);
153+
let mut clauses: Vec<ProgramClause<I>> = vec![];
154+
let builder = &mut ClauseBuilder::new(db, &mut clauses);
153155

154156
debug_heading!("program_clauses_that_could_match(goal={:?})", goal);
155157

@@ -304,7 +306,7 @@ fn program_clauses_that_could_match<I: Interner>(
304306
DomainGoal::Compatible(()) | DomainGoal::Reveal(()) => (),
305307
};
306308

307-
Ok(())
309+
Ok(clauses)
308310
}
309311

310312
/// Generate program clauses from the associated-type values

0 commit comments

Comments
 (0)