Skip to content

Commit 5af448c

Browse files
change filter to return an iterator
1 parent 601cfa3 commit 5af448c

File tree

3 files changed

+22
-20
lines changed

3 files changed

+22
-20
lines changed

soroban-spec/src/shaking.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -118,21 +118,21 @@ fn find_all_in_data(data: &[u8], markers: &mut HashSet<Marker>) {
118118
///
119119
/// # Returns
120120
///
121-
/// Filtered entries with only used types/events remaining.
121+
/// Iterator of filtered entries with only used types/events remaining.
122122
#[allow(clippy::implicit_hasher)]
123-
pub fn filter(entries: Vec<ScSpecEntry>, markers: &HashSet<Marker>) -> Vec<ScSpecEntry> {
124-
entries
125-
.into_iter()
126-
.filter(|entry| {
127-
// Always keep functions - they're the contract's API
128-
if matches!(entry, ScSpecEntry::FunctionV0(_)) {
129-
return true;
130-
}
131-
// For all other entries (types, events), check if marker exists
132-
let marker = generate_marker_for_entry(entry);
133-
markers.contains(&marker)
134-
})
135-
.collect()
123+
pub fn filter<'a, I: IntoIterator<Item = ScSpecEntry> + 'a>(
124+
entries: I,
125+
markers: &'a HashSet<Marker>,
126+
) -> impl Iterator<Item = ScSpecEntry> + 'a {
127+
entries.into_iter().filter(move |entry| {
128+
// Always keep functions - they're the contract's API
129+
if matches!(entry, ScSpecEntry::FunctionV0(_)) {
130+
return true;
131+
}
132+
// For all other entries (types, events), check if marker exists
133+
let marker = generate_marker_for_entry(entry);
134+
markers.contains(&marker)
135+
})
136136
}
137137

138138
#[cfg(test)]
@@ -324,7 +324,7 @@ mod tests {
324324
markers.insert(generate_marker_for_entry(&transfer_event));
325325
markers.insert(generate_marker_for_entry(&mint_event));
326326

327-
let filtered = filter(entries, &markers);
327+
let filtered: Vec<_> = filter(entries, &markers).collect();
328328

329329
// Should have: 1 function + 2 used events
330330
assert_eq!(filtered.len(), 3);
@@ -355,7 +355,7 @@ mod tests {
355355

356356
let markers = HashSet::new();
357357

358-
let filtered = filter(entries, &markers);
358+
let filtered: Vec<_> = filter(entries, &markers).collect();
359359

360360
// Should have: 1 function, 0 events
361361
assert_eq!(filtered.len(), 1);
@@ -373,7 +373,7 @@ mod tests {
373373

374374
let markers = HashSet::new(); // No markers
375375

376-
let filtered = filter(entries, &markers);
376+
let filtered: Vec<_> = filter(entries, &markers).collect();
377377

378378
// Should have: only functions (always kept), no types or events
379379
assert_eq!(filtered.len(), 1);
@@ -403,7 +403,7 @@ mod tests {
403403
markers.insert(generate_marker_for_entry(&used_enum));
404404
markers.insert(generate_marker_for_entry(&used_event));
405405

406-
let filtered = filter(entries, &markers);
406+
let filtered: Vec<_> = filter(entries, &markers).collect();
407407

408408
// Should have: 1 function + 1 struct + 1 enum + 1 event
409409
assert_eq!(filtered.len(), 4);

tests-expanded/test_spec_shaking_v2_tests.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20962,7 +20962,8 @@ mod test {
2096220962
fn test_spec_shaking_v2() {
2096320963
let entries = soroban_spec::read::from_wasm(WASM).unwrap();
2096420964
let markers = soroban_spec::shaking::find_all(WASM);
20965-
let filtered = soroban_spec::shaking::filter(entries.clone(), &markers);
20965+
let filtered: Vec<_> =
20966+
soroban_spec::shaking::filter(entries.iter().cloned(), &markers).collect();
2096620967
let filtered_names: HashSet<std::string::String> =
2096720968
filtered.iter().filter_map(entry_name).collect();
2096820969
let fn_names: Vec<std::string::String> = filtered

tests/spec_shaking_v2/src/test.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ fn test_spec_shaking_v2() {
1616
let markers = soroban_spec::shaking::find_all(WASM);
1717

1818
// Filter entries using markers.
19-
let filtered = soroban_spec::shaking::filter(entries.clone(), &markers);
19+
let filtered: Vec<_> =
20+
soroban_spec::shaking::filter(entries.iter().cloned(), &markers).collect();
2021

2122
// Collect names of filtered entries by kind for assertions.
2223
let filtered_names: HashSet<std::string::String> =

0 commit comments

Comments
 (0)