diff --git a/src/obikseq/src/packed_seq.rs b/src/obikseq/src/packed_seq.rs index 3acac76..601e667 100644 --- a/src/obikseq/src/packed_seq.rs +++ b/src/obikseq/src/packed_seq.rs @@ -261,8 +261,13 @@ impl PackedSeq { /// Extract nucleotides `[start, end)` as a new [`PackedSeq`]. Allocates. pub fn sub(&self, start: usize, end: usize) -> Self { debug_assert!(end > start && end <= self.seql()); - let nucs: Vec = (start..end).map(|i| self.nucleotide(i)).collect(); - Self::from_nucleotides(&nucs) + let seql = end - start; + let n = (seql + 3) / 4; + let mut out = vec![0u8; n]; + let src = self.seq.view_bits::(); + let dst = out.view_bits_mut::(); + dst[..seql * 2].copy_from_bitslice(&src[start * 2..end * 2]); + Self::new(count_to_tail(seql), out.into_boxed_slice()) } /// Serialise one chunk to binary.