Skip to content

Commit 72396a7

Browse files
committed
use hashsets
1 parent 2d3cfb5 commit 72396a7

File tree

3 files changed

+45
-97
lines changed

3 files changed

+45
-97
lines changed

src/main.rs

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn main() {
3636
println!("Changed files: {:?}", changed_files);
3737

3838
let start = Instant::now();
39-
let filtered_files = filter(changed_files, include_patterns_filters, exclude_patterns_filters);
39+
let filtered_files = filter_files(changed_files, include_patterns_filters, exclude_patterns_filters);
4040
let duration = start.elapsed();
4141
println!("Filtering files done in: {:?}", duration);
4242

@@ -133,52 +133,39 @@ fn get_changed_files() -> Vec<String> {
133133
changed_files
134134
}
135135

136-
fn filter(changed_files: Vec<String>, include_patterns_filters: Vec<PatternFilter>, exclude_patterns_filters: Vec<PatternFilter>) -> HashSet<String> {
137-
let filtered_files: Vec<String> = include_patterns_filters
138-
.iter()
139-
.flat_map(|pattern| filter_files_by_pattern(pattern, &changed_files, &exclude_patterns_filters))
140-
.collect();
141-
136+
fn filter_files(changed_files: Vec<String>, include_patterns_filters: HashSet<String>, exclude_patterns_filters: HashSet<String>) -> HashSet<String> {
142137
let mut hash_set_filtered_files = HashSet::new();
143-
hash_set_filtered_files.extend(filtered_files.clone());
144138

145-
hash_set_filtered_files
146-
}
139+
for changed_file in changed_files.iter() {
140+
include_patterns_filters.iter().for_each(|pattern| {
141+
if Pattern::new(pattern).expect("Failed to create pattern").matches(changed_file) {
142+
hash_set_filtered_files.insert(changed_file.to_string());
143+
}
147144

148-
fn filter_files_by_pattern(pattern_filter: &PatternFilter, files: &Vec<String>, exclude_patterns: &Vec<PatternFilter>) -> Vec<String> {
149-
let pattern = Pattern::new(&pattern_filter.pattern).expect("Failed to create pattern");
150-
151-
let mut filtered_files: Vec<String> = files
152-
.iter()
153-
.filter(|file| pattern.matches(file))
154-
.filter(|_| pattern_filter.exclude == false)
155-
.map(|file| file.to_string())
156-
.collect();
157-
158-
for exclude_pattern in exclude_patterns.iter() {
159-
filtered_files = filtered_files
160-
.iter()
161-
.filter(|file| !Pattern::new(&exclude_pattern.pattern).expect("Failed to create pattern").matches(file))
162-
.map(|file| file.to_string())
163-
.collect();
145+
exclude_patterns_filters.iter().for_each(|pattern| {
146+
if Pattern::new(pattern).expect("Failed to create pattern").matches(changed_file) {
147+
hash_set_filtered_files.remove(changed_file);
148+
}
149+
});
150+
});
164151
}
165152

166-
filtered_files
153+
hash_set_filtered_files
167154
}
168155

169156
fn get_count(filtered_files: HashSet<String>) -> usize {
170157
filtered_files.len()
171158
}
172159

173-
fn categorize_filters(filters: Vec<PatternFilter>) -> (Vec<PatternFilter>, Vec<PatternFilter>) {
174-
let mut exclude_patterns_filters: Vec<PatternFilter> = Vec::new();
175-
let mut include_patterns_filters: Vec<PatternFilter> = Vec::new();
160+
fn categorize_filters(filters: Vec<PatternFilter>) -> (HashSet<String>, HashSet<String>) {
161+
let mut exclude_patterns_filters: HashSet<String> = HashSet::new();
162+
let mut include_patterns_filters: HashSet<String> = HashSet::new();
176163

177164
filters.iter().for_each(|pattern_filter| {
178165
if pattern_filter.exclude {
179-
exclude_patterns_filters.push(pattern_filter.clone());
166+
exclude_patterns_filters.insert(pattern_filter.clone().pattern);
180167
} else {
181-
include_patterns_filters.push(pattern_filter.clone());
168+
include_patterns_filters.insert(pattern_filter.clone().pattern);
182169
}
183170
});
184171

src/tests/integration.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ mod integration {
1717

1818
let (include_patterns_filters, exclude_patterns_filters) = categorize_filters(filters);
1919

20-
let filtered_files = filter(files, include_patterns_filters, exclude_patterns_filters);
20+
let filtered_files = filter_files(files, include_patterns_filters, exclude_patterns_filters);
2121

2222
let count = get_count(filtered_files.clone());
2323

src/tests/unit.rs

Lines changed: 25 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ mod unit {
3333
let (include_patterns_filters, exclude_patterns_filters) = categorize_filters(filters);
3434
assert_eq!(include_patterns_filters.len(), 1);
3535
assert_eq!(exclude_patterns_filters.len(), 1);
36-
assert_eq!(include_patterns_filters[0].pattern, "*.rs");
37-
assert_eq!(exclude_patterns_filters[0].pattern, "test/*.rs");
36+
assert_eq!(include_patterns_filters.contains("*.rs"), true);
37+
assert_eq!(exclude_patterns_filters.contains("test/*.rs"), true);
3838
}
3939

4040
#[test]
@@ -44,25 +44,15 @@ mod unit {
4444
String::from("lib.rs"),
4545
String::from("test.txt"),
4646
];
47-
let include_patterns_filters = vec![
48-
PatternFilter {
49-
pattern: String::from("*.rs"),
50-
exclude: false,
51-
},
52-
PatternFilter {
53-
pattern: String::from("src/**"),
54-
exclude: false,
55-
},
56-
PatternFilter {
57-
pattern: String::from("*.txt"),
58-
exclude: false,
59-
},
60-
];
61-
let exclude_patterns_filters = vec![PatternFilter {
62-
pattern: String::from("test.txt"),
63-
exclude: true,
64-
}];
65-
let filtered_files = filter(files, include_patterns_filters, exclude_patterns_filters);
47+
let include_patterns_filters = HashSet::from([
48+
String::from("*.rs"),
49+
String::from("src/**"),
50+
String::from("*.txt"),
51+
]);
52+
let exclude_patterns_filters = HashSet::from([
53+
String::from("test.txt")
54+
]);
55+
let filtered_files = filter_files(files, include_patterns_filters, exclude_patterns_filters);
6656
let expected_filtered_files = HashSet::from([
6757
String::from("src/main.rs"),
6858
String::from("lib.rs"),
@@ -71,44 +61,15 @@ mod unit {
7161
assert_eq!(filtered_files, expected_filtered_files);
7262
}
7363

74-
#[test]
75-
fn test_filter_files_by_pattern() {
76-
let pattern_filter = PatternFilter {
77-
pattern: String::from("*.rs"),
78-
exclude: false,
79-
};
80-
let files = vec![
81-
String::from("main.rs"),
82-
String::from("lib.rs"),
83-
String::from("test.txt"),
84-
];
85-
let filtered = filter_files_by_pattern(&pattern_filter, &files, &Vec::new());
86-
assert_eq!(
87-
filtered,
88-
vec![String::from("main.rs"), String::from("lib.rs")]
89-
);
90-
}
91-
9264
#[test]
9365
fn test_filter_exclude_files_exclusion() {
94-
let mut filtered_files: Vec<String> = Vec::new();
95-
let mut exclude_patterns_filters: Vec<PatternFilter> = Vec::new();
96-
let mut include_patterns_filters: Vec<PatternFilter> = Vec::new();
97-
98-
include_patterns_filters.push(PatternFilter {
99-
pattern: String::from("*.rs"),
100-
exclude: false,
101-
});
102-
103-
include_patterns_filters.push(PatternFilter {
104-
pattern: String::from("*.txt"),
105-
exclude: false,
106-
});
107-
108-
exclude_patterns_filters.push(PatternFilter {
109-
pattern: String::from("test.txt"),
110-
exclude: true,
111-
});
66+
let exclude_patterns_filters = HashSet::from([
67+
String::from("test.txt"),
68+
]);
69+
let include_patterns_filters = HashSet::from([
70+
String::from("*.rs"),
71+
String::from("*.txt"),
72+
]);
11273

11374
let files = vec![
11475
String::from("main.rs"),
@@ -117,14 +78,14 @@ mod unit {
11778
String::from("test.txt"),
11879
];
11980

120-
for pattern in include_patterns_filters.iter() {
121-
filtered_files.extend(filter_files_by_pattern(&pattern, &files, &exclude_patterns_filters));
122-
}
81+
let filtered_files = filter_files(files, include_patterns_filters, exclude_patterns_filters);
82+
let expected_filtered_files = HashSet::from([
83+
String::from("main.rs"),
84+
String::from("lib.rs"),
85+
String::from("version.txt"),
86+
]);
12387

124-
assert_eq!(
125-
filtered_files,
126-
vec![String::from("main.rs"), String::from("lib.rs"), String::from("version.txt")]
127-
);
88+
assert_eq!(filtered_files, expected_filtered_files);
12889
}
12990

13091
#[test]

0 commit comments

Comments
 (0)