noodles_sam/record/
sequence.rs1#[derive(Debug, Eq, PartialEq)]
3pub struct Sequence<'a>(&'a [u8]);
4
5impl<'a> Sequence<'a> {
6 pub(crate) fn new(buf: &'a [u8]) -> Self {
7 Self(buf)
8 }
9
10 pub fn is_empty(&self) -> bool {
12 self.0.is_empty()
13 }
14
15 pub fn get(&self, i: usize) -> Option<u8> {
17 self.0.get(i).copied()
18 }
19
20 pub fn len(&self) -> usize {
22 self.0.len()
23 }
24}
25
26impl AsRef<[u8]> for Sequence<'_> {
27 fn as_ref(&self) -> &[u8] {
28 self.0
29 }
30}
31
32impl crate::alignment::record::Sequence for Sequence<'_> {
33 fn is_empty(&self) -> bool {
34 self.is_empty()
35 }
36
37 fn len(&self) -> usize {
38 self.len()
39 }
40
41 fn get(&self, i: usize) -> Option<u8> {
42 self.get(i)
43 }
44
45 fn split_at_checked(
46 &self,
47 mid: usize,
48 ) -> Option<(
49 Box<dyn crate::alignment::record::Sequence + '_>,
50 Box<dyn crate::alignment::record::Sequence + '_>,
51 )> {
52 if mid <= self.len() {
53 let (left, right) = self.0.split_at(mid);
54 Some((
55 Box::new(Sequence::new(left)),
56 Box::new(Sequence::new(right)),
57 ))
58 } else {
59 None
60 }
61 }
62
63 fn iter(&self) -> Box<dyn Iterator<Item = u8> + '_> {
64 Box::new(self.as_ref().iter().copied())
65 }
66}
67
68impl<'a> From<Sequence<'a>> for crate::alignment::record_buf::Sequence {
69 fn from(sequence: Sequence<'a>) -> Self {
70 Self::from(sequence.0.to_vec())
71 }
72}
73
74#[cfg(test)]
75mod tests {
76 use super::*;
77
78 #[test]
79 fn test_crate_alignment_record_sequence_iter() {
80 fn t(src: &[u8]) {
81 let sequence: &dyn crate::alignment::record::Sequence = &Sequence::new(src);
82 let actual: Vec<_> = sequence.iter().collect();
83 assert_eq!(actual, src);
84 }
85
86 t(&[]);
87 t(b"ACG");
88 t(b"ACGT");
89 }
90}