sigalign_utils/sequence_manipulation/
reverse_complementary.rs

1/// Returns the reverse complement of a DNA sequence.
2/// A, C, G, T are converted to T, G, C, A and other characters are remain unchanged.
3pub fn reverse_complement_of_dna_sequence(sequence: &[u8]) -> Vec<u8> {
4    let mut reverse_complement = Vec::with_capacity(sequence.len());
5    for base in sequence.iter().rev() {
6        reverse_complement.push(match base {
7            b'A' => b'T',
8            b'C' => b'G',
9            b'G' => b'C',
10            b'T' => b'A',
11            _ => *base,
12        });
13    }
14    reverse_complement
15}
16
17/// Returns the reverse complement of a DNA sequence (in-place).
18pub fn reverse_complement_of_dna_sequence_in_place(sequence: &mut [u8]) {
19    let mut i = 0;
20    let mut j = sequence.len() - 1;
21    while i < j {
22        sequence.swap(i, j);
23        i += 1;
24        j -= 1;
25    }
26    sequence.iter_mut().for_each(|x| {
27        *x = match x {
28            b'A' => b'T',
29            b'C' => b'G',
30            b'G' => b'C',
31            b'T' => b'A',
32            _ => *x,
33        }
34    });
35}