Skip to content

Commit dea5f82

Browse files
committed
Use chain and filter instead of extending a vec in program_clauses_for_goal
Signed-off-by: Zahari Dichev <[email protected]>
1 parent 80c17b8 commit dea5f82

File tree

1 file changed

+20
-17
lines changed

1 file changed

+20
-17
lines changed

chalk-solve/src/clauses.rs

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -121,21 +121,24 @@ 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+
.filter(|c| c.could_match(interner, goal))
131+
.chain(
132+
db.program_clauses_for_env(environment)
133+
.iter(interner)
134+
.filter(|c| (*c).could_match(interner, goal))
135+
.cloned(),
136+
)
137+
.collect();
135138

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

138-
Ok(vec)
141+
Ok(clauses)
139142
}
140143

141144
/// Returns a set of program clauses that could possibly match
@@ -146,10 +149,10 @@ fn program_clauses_that_could_match<I: Interner>(
146149
db: &dyn RustIrDatabase<I>,
147150
environment: &Environment<I>,
148151
goal: &DomainGoal<I>,
149-
clauses: &mut Vec<ProgramClause<I>>,
150-
) -> Result<(), Floundered> {
152+
) -> Result<Vec<ProgramClause<I>>, Floundered> {
151153
let interner = db.interner();
152-
let builder = &mut ClauseBuilder::new(db, clauses);
154+
let mut clauses: Vec<ProgramClause<I>> = vec![];
155+
let builder = &mut ClauseBuilder::new(db, &mut clauses);
153156

154157
debug_heading!("program_clauses_that_could_match(goal={:?})", goal);
155158

@@ -304,7 +307,7 @@ fn program_clauses_that_could_match<I: Interner>(
304307
DomainGoal::Compatible(()) | DomainGoal::Reveal(()) => (),
305308
};
306309

307-
Ok(())
310+
Ok(clauses)
308311
}
309312

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

0 commit comments

Comments
 (0)