use crate::kmer::{GetVariants, Kmer, KmerEncode, errors::KmerError};
use std::hash::Hash;
pub mod three_bit;
pub trait KmerEncoder<const MAX_LEN: usize>
where
Self: Sized, {
type EncodedKmer: Eq + Hash + Copy + KmerEncode<MAX_LEN, Self>;
type SeqIter<'a>: Iterator<Item = Self::EncodedKmer>;
type SeqIntoIter: Iterator<Item = Self::EncodedKmer>;
type SeqIterRev<'a>: Iterator<Item = Self::EncodedKmer>;
type SeqIntoIterRev: Iterator<Item = Self::EncodedKmer>;
fn new(kmer_length: usize) -> Result<Self, KmerError>;
fn kmer_length(&self) -> usize;
fn encode_kmer(&self, kmer: impl AsRef<[u8]>) -> Self::EncodedKmer;
fn decode_kmer(&self, encoded_kmer: Self::EncodedKmer) -> Kmer<MAX_LEN>;
fn get_variants<const N: usize>(&self, encoded_kmer: Self::EncodedKmer) -> Self::Iter
where
Self: GetVariants<N, MAX_LEN>, {
<Self as GetVariants<N, MAX_LEN>>::variants(self, encoded_kmer)
}
fn iter_from_sequence<'a, S: AsRef<[u8]> + ?Sized>(&self, seq: &'a S) -> Self::SeqIter<'a>;
fn iter_consuming_seq<S>(&self, seq: S) -> Self::SeqIntoIter
where
S: Into<Vec<u8>>,
for<'a> &'a S: AsRef<Vec<u8>>;
fn iter_from_sequence_rev<'a, S: AsRef<[u8]> + ?Sized>(&self, seq: &'a S) -> Self::SeqIterRev<'a>;
fn iter_consuming_seq_rev<S>(&self, seq: S) -> Self::SeqIntoIterRev
where
S: Into<Vec<u8>>,
for<'a> &'a S: AsRef<Vec<u8>>;
#[inline]
#[must_use]
fn encode_kmer_checked<S: AsRef<[u8]>>(&self, kmer: S) -> Option<Self::EncodedKmer> {
if kmer.as_ref().len() == self.kmer_length() {
Some(self.encode_kmer(kmer))
} else {
None
}
}
#[inline]
fn decode_iter(&self, iter: impl Iterator<Item = Self::EncodedKmer>) -> impl Iterator<Item = Kmer<MAX_LEN>> {
iter.map(|encoded_kmer| self.decode_kmer(encoded_kmer))
}
}