pub fn strip_dag(vertex: &str, char_to_strip: &str) -> String {
let dag = vertex.split(",").collect::<Vec<&str>>();
let dag_original_length = dag.len();
let strip_pattern_1 = format!("-{}", char_to_strip);
let strip_pattern_2 = format!("{}-", char_to_strip);
let strip_pattern_3 = format!("{}", char_to_strip);
let mut new_dag: Vec<String> = Vec::with_capacity(dag_original_length);
let mut done_idx: Vec<usize> = Vec::with_capacity(dag_original_length);
let mut idx_lookahead: usize;
for (idx, vert) in dag.iter().enumerate() {
if done_idx.contains(&idx) {
continue;
}
if vert.contains(char_to_strip) {
let mut stripped_vertice =
strip_vertice(&strip_pattern_1, &strip_pattern_2, &strip_pattern_3, vert);
let stripped_vertice_len = stripped_vertice.len();
idx_lookahead = idx + 1;
while let Some(lookahead_vertice) = check_next_vertice(
&dag,
&idx_lookahead,
&stripped_vertice_len,
char_to_strip,
&stripped_vertice,
&strip_pattern_1,
&strip_pattern_2,
&strip_pattern_3,
) {
stripped_vertice = lookahead_vertice;
done_idx.push(idx_lookahead);
idx_lookahead += 1;
}
new_dag.push(stripped_vertice);
continue;
}
new_dag.push(String::from(*vert))
}
new_dag.sort();
new_dag.join(",")
}
fn strip_vertice(
strip_pattern_1: &String,
strip_pattern_2: &String,
strip_pattern_3: &String,
vertice: &&str,
) -> String {
vertice
.replace(&*strip_pattern_1, "")
.replace(&*strip_pattern_2, "")
.replace(&*strip_pattern_3, "")
}
fn check_next_vertice<'a>(
dag: &Vec<&str>,
idx_lookahead: &'a usize,
vertice_len: &usize,
char_to_strip: &str,
first_stripped_vertice: &String,
strip_pattern_1: &String,
strip_pattern_2: &String,
strip_pattern_3: &String,
) -> Option<String> {
if vertice_len > &1 {
None
} else {
match dag.get(*idx_lookahead) {
Some(lookahead_vertice) if lookahead_vertice.contains(char_to_strip) => Some(format!(
"{}-{}",
first_stripped_vertice,
strip_vertice(
strip_pattern_1,
strip_pattern_2,
strip_pattern_3,
lookahead_vertice
)
)),
_ => None,
}
}
}
#[cfg(test)]
mod test {
use super::strip_dag;
#[test]
fn strips_dag_successfully() {
let original_dag = "a-b,b-c,c-d,c-d";
let vertice_to_strip = "d";
let expected_dag_result = "a-b,b-c,c-c";
let stripped_dag = strip_dag(original_dag, vertice_to_strip);
assert_eq!(expected_dag_result, stripped_dag);
}
#[test]
fn nothing_to_strip() {
let original_dag = "a-b,b-c,c-d,c-d";
let vertice_to_strip = "x";
let expected_dag_result = original_dag;
let stripped_dag = strip_dag(original_dag, vertice_to_strip);
assert_eq!(expected_dag_result, stripped_dag);
}
#[test]
fn strip_alphabetically() {
let original_dag = "a-b,d-c,b-d,c-d";
let vertice_to_strip = "c";
let expected_dag_result = "a-b,b-d,d,d";
let stripped_dag = strip_dag(original_dag, vertice_to_strip);
assert_eq!(expected_dag_result, stripped_dag);
}
}