diff --git a/src/regexp.rs b/src/regexp.rs --- a/src/regexp.rs +++ b/src/regexp.rs @@ -298,18 +298,17 @@ impl RegexpDFA { let mut combined_vec = Vec::from_iter(combined_alphabet.into_iter()); combined_vec.sort(); let combined_index = HashMap::from_iter(combined_vec.iter().enumerate().map(|(i, c)| (*c, i))); - let conversion_index: HashMap = HashMap::from_iter(self.alphabet_index.iter().map(|(k, v)| (*v, combined_index[k]))); + let conversion_index: HashMap = HashMap::from_iter(self.alphabet_index.iter().map(|(k, v)| (combined_index[k], *v))); let n2 = combined_vec.len(); - let mut rules = vec![]; - for i in 0..m { - let mut row = vec![m;n2]; - for (j, st) in self.rules[i*n1..(i+1)*n1].iter().enumerate() { - row[conversion_index[&j]] = *st; + let rules: Vec = (0..m*n2).map( + |i| { + let (j, k) = (i/n2, i%n2); + return if conversion_index.contains_key(&k) { + self.rules[j*n1 + conversion_index[&k]] + } else {m}; } - rules.append(&mut row); - } - rules.append(&mut vec![m;n2]); + ).chain(std::iter::repeat(m).take(n2)).collect(); return RegexpDFA{rules, end_states: self.end_states.clone(), alphabet_index: combined_index}.reduce().normalize(); }