packed_seq/
packed_n_seq.rs

1use super::*;
2
3#[derive(Clone, Copy, Debug, MemSize, MemDbg)]
4#[cfg_attr(feature = "pyo3", pyo3::pyclass)]
5#[cfg_attr(feature = "epserde", derive(epserde::Epserde))]
6pub struct PackedNSeq<'s> {
7    pub seq: PackedSeq<'s>,
8    pub ambiguous: BitSeq<'s>,
9}
10
11#[derive(Clone, Debug, MemSize, MemDbg, Default)]
12#[cfg_attr(feature = "pyo3", pyo3::pyclass)]
13#[cfg_attr(feature = "epserde", derive(epserde::Epserde))]
14pub struct PackedNSeqVec {
15    pub seq: PackedSeqVec,
16    pub ambiguous: BitSeqVec,
17}
18
19/// Implement a subset of `Seq` for `PackedNSeq`.
20impl<'s> PackedNSeq<'s> {
21    pub fn to_revcomp(&self) -> PackedNSeqVec {
22        PackedNSeqVec {
23            seq: self.seq.to_revcomp(),
24            ambiguous: self.ambiguous.to_revcomp(),
25        }
26    }
27
28    pub fn slice(&self, range: Range<usize>) -> PackedNSeq<'s> {
29        PackedNSeq {
30            seq: self.seq.slice(range.clone()),
31            ambiguous: self.ambiguous.slice(range),
32        }
33    }
34}
35
36/// Implement a subset of `SeqVec` for `PackedNSeqVec`.
37impl PackedNSeqVec {
38    pub fn clear(&mut self) {
39        self.seq.clear();
40        self.ambiguous.clear();
41    }
42
43    pub fn random(len: usize, n_frac: f32) -> Self {
44        let seq = PackedSeqVec::random(len);
45        let ambiguous = BitSeqVec::random(len, n_frac);
46        Self { seq, ambiguous }
47    }
48
49    pub fn as_slice(&self) -> PackedNSeq<'_> {
50        PackedNSeq {
51            seq: self.seq.as_slice(),
52            ambiguous: self.ambiguous.as_slice(),
53        }
54    }
55
56    pub fn slice(&self, range: Range<usize>) -> PackedNSeq<'_> {
57        self.as_slice().slice(range).to_owned()
58    }
59
60    pub fn push_ascii(&mut self, seq: &[u8]) -> Range<usize> {
61        let r1 = self.seq.push_ascii(seq);
62        let r2 = self.ambiguous.push_ascii(seq);
63        assert_eq!(r1, r2);
64        r1
65    }
66
67    pub fn from_ascii(seq: &[u8]) -> Self {
68        Self {
69            seq: PackedSeqVec::from_ascii(seq),
70            ambiguous: BitSeqVec::from_ascii(seq),
71        }
72    }
73}