1use crate::interface::alphabet::{Alphabet, AlphabetCharacter};
4use crate::interface::sequence::{EditableGenomeSequence, GenomeSequence, OwnedGenomeSequence};
5use bitvec::prelude::*;
6use ref_cast::RefCast;
7use std::borrow::Borrow;
8use std::hash::Hash;
9use std::iter::FromIterator;
10use std::marker::PhantomData;
11use std::mem;
12use std::ops::{Index, Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
13use traitsequence::interface::{EditableSequence, OwnedSequence, Sequence};
14
15#[derive(Debug)]
17pub struct BitVectorGenome<AlphabetType: Alphabet, BitStoreType = usize>
18where
19 BitStoreType: BitStore,
20{
21 phantom_data: PhantomData<AlphabetType>,
22 pub(crate) bits: BitVec<BitStoreType>,
24}
25
26#[derive(RefCast, Debug, Eq, PartialEq, Hash)]
28#[repr(transparent)]
29pub struct BitVectorSubGenome<AlphabetType: Alphabet, BitStoreType = usize>
30where
31 BitStoreType: BitStore,
32{
33 phantom_data: PhantomData<AlphabetType>,
34 pub(crate) bits: BitSlice<BitStoreType>,
35}
36
37pub struct BitVectorGenomeIterator<AlphabetType: Alphabet, BitStoreType = usize>
39where
40 BitStoreType: BitStore,
41{
42 current: usize,
43 sequence: BitVectorGenome<AlphabetType, BitStoreType>,
44}
45
46pub struct BitVectorSubGenomeIterator<'a, AlphabetType: Alphabet, BitStoreType = usize>
48where
49 BitStoreType: BitStore,
50{
51 slice: &'a BitVectorSubGenome<AlphabetType, BitStoreType>,
52}
53
54impl<AlphabetType: Alphabet, BitStoreType: BitStore> BitVectorGenome<AlphabetType, BitStoreType> {
55 pub fn size_in_memory(&self) -> usize {
58 std::mem::size_of::<BitVec>() + self.bits.capacity() / 8
59 }
60}
61
62impl<AlphabetType: Alphabet, BitStoreType: BitStore>
63 Sequence<AlphabetType::CharacterType, BitVectorSubGenome<AlphabetType, BitStoreType>>
64 for BitVectorGenome<AlphabetType, BitStoreType>
65{
66 type Iterator<'a>
67 = BitVectorSubGenomeIterator<'a, AlphabetType, BitStoreType>
68 where
69 AlphabetType: 'a;
70
71 fn iter(&self) -> Self::Iterator<'_> {
72 self.as_genome_subsequence().iter()
73 }
74
75 fn len(&self) -> usize {
76 self.as_genome_subsequence().len()
77 }
78}
79
80impl<AlphabetType: Alphabet, BitStoreType: BitStore>
81 Sequence<AlphabetType::CharacterType, BitVectorSubGenome<AlphabetType, BitStoreType>>
82 for BitVectorSubGenome<AlphabetType, BitStoreType>
83{
84 type Iterator<'a>
85 = BitVectorSubGenomeIterator<'a, AlphabetType, BitStoreType>
86 where
87 AlphabetType: 'a;
88
89 fn iter(&self) -> Self::Iterator<'_> {
90 BitVectorSubGenomeIterator { slice: self }
91 }
92
93 fn len(&self) -> usize {
94 self.bits.len() / alphabet_character_bit_width(AlphabetType::SIZE)
95 }
96}
97
98impl<AlphabetType: Alphabet, BitStoreType: BitStore>
99 EditableSequence<AlphabetType::CharacterType, BitVectorSubGenome<AlphabetType, BitStoreType>>
100 for BitVectorGenome<AlphabetType, BitStoreType>
101{
102 fn set(&mut self, index: usize, character: <AlphabetType as Alphabet>::CharacterType) {
103 let bit_width = alphabet_character_bit_width(AlphabetType::SIZE);
104 let value = character.index();
105 self.bits[index * bit_width..(index + 1) * bit_width]
106 .clone_from_bitslice(&value.view_bits::<Lsb0>()[0..bit_width]);
107 }
108
109 fn split_off(&mut self, at: usize) -> Self {
110 Self {
111 phantom_data: self.phantom_data,
112 bits: self.bits.split_off(at),
113 }
114 }
115
116 fn reserve(&mut self, additional: usize) {
117 let bit_width = alphabet_character_bit_width(AlphabetType::SIZE);
118 self.bits.reserve(additional * bit_width)
119 }
120
121 fn resize(&mut self, new_len: usize, default: AlphabetType::CharacterType) {
122 let bit_width = alphabet_character_bit_width(AlphabetType::SIZE);
123 if self.len() >= new_len {
124 self.bits.resize(new_len * bit_width, false);
125 } else {
126 let difference = new_len - self.len();
127 let value = default.index();
128 for _ in 0..difference {
129 self.bits
130 .extend_from_bitslice(&value.view_bits::<Lsb0>()[0..bit_width]);
131 }
132 }
133 }
134
135 fn resize_with(
136 &mut self,
137 new_len: usize,
138 mut generator: impl FnMut() -> AlphabetType::CharacterType,
139 ) {
140 let bit_width = alphabet_character_bit_width(AlphabetType::SIZE);
141 if self.len() >= new_len {
142 self.bits.resize(new_len * bit_width, false);
143 } else {
144 let difference = new_len - self.len();
145 let value = generator().index();
146 for _ in 0..difference {
147 self.bits
148 .extend_from_bitslice(&value.view_bits::<Lsb0>()[0..bit_width]);
149 }
150 }
151 }
152
153 fn push(&mut self, character: AlphabetType::CharacterType) {
154 let bit_width = alphabet_character_bit_width(AlphabetType::SIZE);
155 let value = character.index();
156 self.bits
157 .extend_from_bitslice(&value.view_bits::<Lsb0>()[0..bit_width])
158 }
159
160 fn splice(
161 &mut self,
162 range: Range<usize>,
163 replace_with: impl IntoIterator<Item = AlphabetType::CharacterType>,
164 ) {
165 assert!(range.end <= self.len());
166
167 let suffix: Self = self.iter().skip(range.end).cloned().collect();
168 self.resize_with(range.start, || unreachable!());
169 self.extend(replace_with);
170 self.extend(suffix);
171
172 }
185}
186
187impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<Range<usize>>
188 for BitVectorGenome<AlphabetType, BitStoreType>
189{
190 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
191
192 fn index(&self, index: Range<usize>) -> &Self::Output {
193 self.as_genome_subsequence().index(index)
194 }
195}
196
197impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeFrom<usize>>
198 for BitVectorGenome<AlphabetType, BitStoreType>
199{
200 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
201
202 fn index(&self, index: RangeFrom<usize>) -> &Self::Output {
203 self.as_genome_subsequence().index(index)
204 }
205}
206
207impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeTo<usize>>
208 for BitVectorGenome<AlphabetType, BitStoreType>
209{
210 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
211
212 fn index(&self, index: RangeTo<usize>) -> &Self::Output {
213 self.as_genome_subsequence().index(index)
214 }
215}
216
217impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeFull>
218 for BitVectorGenome<AlphabetType, BitStoreType>
219{
220 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
221
222 fn index(&self, index: RangeFull) -> &Self::Output {
223 self.as_genome_subsequence().index(index)
224 }
225}
226
227impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeInclusive<usize>>
228 for BitVectorGenome<AlphabetType, BitStoreType>
229{
230 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
231
232 fn index(&self, index: RangeInclusive<usize>) -> &Self::Output {
233 self.as_genome_subsequence().index(index)
234 }
235}
236
237impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeToInclusive<usize>>
238 for BitVectorGenome<AlphabetType, BitStoreType>
239{
240 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
241
242 fn index(&self, index: RangeToInclusive<usize>) -> &Self::Output {
243 self.as_genome_subsequence().index(index)
244 }
245}
246
247impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<usize>
248 for BitVectorGenome<AlphabetType, BitStoreType>
249{
250 type Output = AlphabetType::CharacterType;
251
252 fn index(&self, index: usize) -> &Self::Output {
253 self.as_genome_subsequence().index(index)
254 }
255}
256
257impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<Range<usize>>
258 for BitVectorSubGenome<AlphabetType, BitStoreType>
259{
260 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
261
262 fn index(&self, index: Range<usize>) -> &Self::Output {
263 let bit_width = alphabet_character_bit_width(AlphabetType::SIZE);
264 BitVectorSubGenome::ref_cast(&self.bits[index.start * bit_width..index.end * bit_width])
265 }
266}
267
268impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeFrom<usize>>
269 for BitVectorSubGenome<AlphabetType, BitStoreType>
270{
271 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
272
273 fn index(&self, index: RangeFrom<usize>) -> &Self::Output {
274 self.index(index.start..self.len())
275 }
276}
277
278impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeTo<usize>>
279 for BitVectorSubGenome<AlphabetType, BitStoreType>
280{
281 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
282
283 fn index(&self, index: RangeTo<usize>) -> &Self::Output {
284 self.index(0..index.end)
285 }
286}
287
288impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeFull>
289 for BitVectorSubGenome<AlphabetType, BitStoreType>
290{
291 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
292
293 fn index(&self, _index: RangeFull) -> &Self::Output {
294 self.index(0..self.len())
295 }
296}
297
298impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeInclusive<usize>>
299 for BitVectorSubGenome<AlphabetType, BitStoreType>
300{
301 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
302
303 fn index(&self, index: RangeInclusive<usize>) -> &Self::Output {
304 let bit_width = alphabet_character_bit_width(AlphabetType::SIZE);
305 BitVectorSubGenome::ref_cast(
306 &self.bits[index.start() * bit_width..=index.end() * bit_width],
307 )
308 }
309}
310
311impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<RangeToInclusive<usize>>
312 for BitVectorSubGenome<AlphabetType, BitStoreType>
313{
314 type Output = BitVectorSubGenome<AlphabetType, BitStoreType>;
315
316 fn index(&self, index: RangeToInclusive<usize>) -> &Self::Output {
317 self.index(0..=index.end)
318 }
319}
320
321impl<AlphabetType: Alphabet, BitStoreType: BitStore> Index<usize>
322 for BitVectorSubGenome<AlphabetType, BitStoreType>
323{
324 type Output = AlphabetType::CharacterType;
325
326 fn index(&self, index: usize) -> &Self::Output {
327 let bit_width = alphabet_character_bit_width(AlphabetType::SIZE);
328 let offset = index * bit_width;
329 let limit = (index + 1) * bit_width;
330 let value: u8 = self.bits[offset..limit].load();
331 Self::Output::from_index_ref(value).expect("bitvec contains invalid character")
332 }
333}
334
335impl<AlphabetType: Alphabet, BitStoreType: BitStore> FromIterator<AlphabetType::CharacterType>
336 for BitVectorGenome<AlphabetType, BitStoreType>
337{
338 fn from_iter<T: IntoIterator<Item = AlphabetType::CharacterType>>(iter: T) -> Self {
339 let mut result = Self::default();
340 result.extend(iter);
341 result
342 }
343}
344
345impl<AlphabetType: Alphabet, BitStoreType: BitStore> Extend<AlphabetType::CharacterType>
346 for BitVectorGenome<AlphabetType, BitStoreType>
347{
348 fn extend<T: IntoIterator<Item = AlphabetType::CharacterType>>(&mut self, iter: T) {
349 let iter = iter.into_iter();
350 let (size, _) = iter.size_hint();
351 let bit_width = alphabet_character_bit_width(AlphabetType::SIZE);
352 self.bits.reserve(size * bit_width);
353
354 for character in iter {
355 let value = character.index();
356 self.bits
357 .extend_from_bitslice(&value.view_bits::<Lsb0>()[0..bit_width]);
358 }
359 }
360}
361
362impl<AlphabetType: Alphabet, BitStoreType: BitStore> IntoIterator
363 for BitVectorGenome<AlphabetType, BitStoreType>
364{
365 type Item = AlphabetType::CharacterType;
366 type IntoIter = BitVectorGenomeIterator<AlphabetType, BitStoreType>;
367
368 fn into_iter(self) -> Self::IntoIter {
369 BitVectorGenomeIterator {
370 sequence: self,
371 current: 0,
372 }
373 }
374}
375
376impl<AlphabetType: Alphabet, BitStoreType: BitStore> Iterator
377 for BitVectorGenomeIterator<AlphabetType, BitStoreType>
378{
379 type Item = AlphabetType::CharacterType;
380
381 fn next(&mut self) -> Option<Self::Item> {
382 if self.current < self.sequence.len() {
383 let result = self.sequence[self.current].clone();
384 self.current += 1;
385 Some(result)
386 } else {
387 None
388 }
389 }
390}
391
392impl<'iter, AlphabetType: Alphabet, BitStoreType: BitStore> Iterator
393 for BitVectorSubGenomeIterator<'iter, AlphabetType, BitStoreType>
394{
395 type Item = &'iter AlphabetType::CharacterType;
396
397 fn next(&mut self) -> Option<Self::Item> {
398 if self.slice.len() > 0 {
399 let result = &self.slice[0];
400 self.slice = &self.slice[1..self.slice.len()];
401 Some(result)
402 } else {
403 None
404 }
405 }
406}
407
408impl<AlphabetType: Alphabet, BitStoreType: BitStore> DoubleEndedIterator
409 for BitVectorSubGenomeIterator<'_, AlphabetType, BitStoreType>
410{
411 fn next_back(&mut self) -> Option<Self::Item> {
412 if self.slice.len() > 0 {
413 let result = &self.slice[self.slice.len() - 1];
414 self.slice = &self.slice[0..self.slice.len() - 1];
415 Some(result)
416 } else {
417 None
418 }
419 }
420}
421
422impl<AlphabetType: Alphabet, BitStoreType: BitStore>
423 Borrow<BitVectorSubGenome<AlphabetType, BitStoreType>>
424 for BitVectorGenome<AlphabetType, BitStoreType>
425{
426 fn borrow(&self) -> &BitVectorSubGenome<AlphabetType, BitStoreType> {
427 self.as_genome_subsequence()
428 }
429}
430
431impl<AlphabetType: Alphabet, BitStoreType: BitStore> ToOwned
432 for BitVectorSubGenome<AlphabetType, BitStoreType>
433{
434 type Owned = BitVectorGenome<AlphabetType, BitStoreType>;
435
436 fn to_owned(&self) -> Self::Owned {
437 self.iter().cloned().collect()
438 }
439}
440
441impl<AlphabetType: Alphabet, BitStoreType: BitStore>
442 GenomeSequence<AlphabetType, BitVectorSubGenome<AlphabetType, BitStoreType>>
443 for BitVectorGenome<AlphabetType, BitStoreType>
444{
445 fn as_genome_subsequence(&self) -> &BitVectorSubGenome<AlphabetType, BitStoreType> {
446 BitVectorSubGenome::ref_cast(&self.bits[..])
447 }
448}
449
450impl<AlphabetType: Alphabet, BitStoreType: BitStore>
451 OwnedGenomeSequence<AlphabetType, BitVectorSubGenome<AlphabetType, BitStoreType>>
452 for BitVectorGenome<AlphabetType, BitStoreType>
453{
454}
455
456impl<AlphabetType: Alphabet, BitStoreType: BitStore>
457 EditableGenomeSequence<AlphabetType, BitVectorSubGenome<AlphabetType, BitStoreType>>
458 for BitVectorGenome<AlphabetType, BitStoreType>
459{
460}
461
462impl<AlphabetType: Alphabet, BitStoreType: BitStore>
463 GenomeSequence<AlphabetType, BitVectorSubGenome<AlphabetType, BitStoreType>>
464 for BitVectorSubGenome<AlphabetType, BitStoreType>
465{
466}
467
468impl<AlphabetType: Alphabet, BitStoreType: BitStore>
469 OwnedSequence<AlphabetType::CharacterType, BitVectorSubGenome<AlphabetType, BitStoreType>>
470 for BitVectorGenome<AlphabetType, BitStoreType>
471{
472}
473
474impl<AlphabetType: Alphabet, BitStoreType: BitStore> Default
475 for BitVectorGenome<AlphabetType, BitStoreType>
476{
477 fn default() -> Self {
478 Self {
479 phantom_data: Default::default(),
480 bits: Default::default(),
481 }
482 }
483}
484
485impl<AlphabetType: Alphabet, BitStoreType: BitStore> Clone
486 for BitVectorGenome<AlphabetType, BitStoreType>
487{
488 fn clone(&self) -> Self {
489 Self {
490 phantom_data: PhantomData,
491 bits: self.bits.clone(),
492 }
493 }
494}
495
496impl<AlphabetType: Alphabet, BitStoreType: BitStore> Eq
497 for BitVectorGenome<AlphabetType, BitStoreType>
498{
499}
500
501impl<AlphabetType: Alphabet, BitStoreType: BitStore> PartialEq
502 for BitVectorGenome<AlphabetType, BitStoreType>
503{
504 fn eq(&self, other: &Self) -> bool {
505 self.bits.eq(&other.bits)
506 }
507}
508
509impl<AlphabetType: Alphabet, BitStoreType: BitStore> Hash
510 for BitVectorGenome<AlphabetType, BitStoreType>
511{
512 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
513 self.bits.hash(state)
514 }
515}
516
517pub(crate) const fn alphabet_character_bit_width(size: u8) -> usize {
518 mem::size_of::<u8>() * 8 - ((size - 1).leading_zeros() as usize)
519}
520
521#[cfg(test)]
522mod tests {
523 use crate::implementation::alphabets::dna_alphabet::DnaAlphabet;
524 use crate::implementation::bit_vec_sequence::BitVectorGenome;
525 use crate::interface::alphabet::Alphabet;
526 use crate::interface::sequence::{EditableGenomeSequence, GenomeSequence, OwnedGenomeSequence};
527 use traitsequence::interface::{EditableSequence, Sequence};
528
529 #[test]
530 fn test_reverse_complement() {
531 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATTCGGT").unwrap();
532 let reverse_complement = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ACCGAAT").unwrap();
533 assert_eq!(genome.clone_as_reverse_complement(), reverse_complement);
534 assert_eq!(genome, reverse_complement.clone_as_reverse_complement());
535 }
536
537 #[test]
538 fn test_display() {
539 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATTCGGT").unwrap();
540 let display_string = genome.as_string();
541 let expected_string = "ATTCGGT";
542 assert_eq!(display_string, expected_string);
543 }
544
545 #[test]
546 fn test_substrings() {
547 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATTCGGT").unwrap();
548
549 let display_string = genome[1..4].as_string();
550 let expected_string = "TTC";
551 assert_eq!(display_string, expected_string);
552
553 let display_string = genome.clone_as_reverse_complement()[1..4].as_string();
554 let expected_string = "CCG";
555 assert_eq!(display_string, expected_string);
556
557 let display_string =
558 genome[1..6].to_owned().clone_as_reverse_complement()[1..4].as_string();
559 let expected_string = "CGA";
560 assert_eq!(display_string, expected_string);
561 }
562
563 #[test]
564 fn test_empty_substring_after_end() {
565 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATTCGGT").unwrap();
566 let display_string = genome[7..7].as_string();
567 let expected_string = "";
568 assert_eq!(display_string, expected_string);
569 }
570
571 #[test]
572 #[should_panic]
573 fn test_empty_substring_after_end2() {
574 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATTCGGT").unwrap();
575 let display_string = genome[8..8].as_string();
576 let expected_string = "";
577 assert_eq!(display_string, expected_string);
578 }
579
580 #[test]
581 fn test_canonical() {
582 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATTCGGT").unwrap();
583 assert!(!genome.is_canonical());
584 assert!(genome.clone_as_reverse_complement().is_canonical());
585 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATAT").unwrap();
586 assert!(genome.is_canonical());
587 assert!(genome.clone_as_reverse_complement().is_canonical());
588 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"CGTA").unwrap();
589 assert!(genome.is_canonical());
590 assert!(!genome.clone_as_reverse_complement().is_canonical());
591 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"").unwrap();
592 assert!(genome.is_canonical());
593 assert!(genome.clone_as_reverse_complement().is_canonical());
594 }
595
596 #[test]
597 fn test_self_complemental() {
598 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATTCGGT").unwrap();
599 assert!(!genome.is_self_complemental());
600 assert!(!genome.clone_as_reverse_complement().is_self_complemental());
601 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATAT").unwrap();
602 assert!(genome.is_self_complemental());
603 assert!(genome.clone_as_reverse_complement().is_self_complemental());
604 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"CGTA").unwrap();
605 assert!(!genome.is_self_complemental());
606 assert!(!genome.clone_as_reverse_complement().is_self_complemental());
607 let genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"").unwrap();
608 assert!(genome.is_self_complemental());
609 assert!(genome.clone_as_reverse_complement().is_self_complemental());
610 }
611
612 #[test]
613 fn test_extend() {
614 let mut genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATT").unwrap();
615 genome.extend_from_slice_u8(b"CGT").unwrap();
616 assert_eq!(
617 genome,
618 BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATTCGT").unwrap()
619 );
620 assert_eq!(genome[0], DnaAlphabet::ascii_to_character(b'A').unwrap());
621 assert_eq!(genome[1], DnaAlphabet::ascii_to_character(b'T').unwrap());
622 assert_eq!(genome[2], DnaAlphabet::ascii_to_character(b'T').unwrap());
623 assert_eq!(genome[3], DnaAlphabet::ascii_to_character(b'C').unwrap());
624 assert_eq!(genome[4], DnaAlphabet::ascii_to_character(b'G').unwrap());
625 assert_eq!(genome[5], DnaAlphabet::ascii_to_character(b'T').unwrap());
626 }
627
628 #[test]
629 fn test_splice() {
630 let mut genome = BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATCTGT").unwrap();
631 let insertion: BitVectorGenome<DnaAlphabet> =
632 genome.iter().skip(1).take(3).cloned().collect();
633 genome.splice(3..3, insertion);
634 assert_eq!(
635 genome,
636 BitVectorGenome::<DnaAlphabet>::from_slice_u8(b"ATCTCTTGT").unwrap()
637 );
638 }
639}