pub mod nw;
#[cfg(feature = "dev-phmm")]
pub mod phmm;
pub mod sw;
mod errors;
mod pairwise;
mod profile;
mod profile_set;
mod sneaky_snake;
mod std_traits;
mod types;
pub use errors::*;
pub use pairwise::*;
pub use profile::*;
pub use profile_set::*;
pub use sneaky_snake::*;
pub use types::*;
pub(crate) trait HasQueryAndRefData {
fn invert(self) -> Self;
}
impl<T> HasQueryAndRefData for Alignment<T>
where
T: Copy,
{
#[inline]
fn invert(self) -> Self {
Alignment::invert(&self)
}
}
impl<T> HasQueryAndRefData for ScoreIndices<T> {
#[inline]
fn invert(self) -> Self {
Self {
score: self.score,
ref_idx: self.query_idx,
query_idx: self.ref_idx,
}
}
}
impl<T> HasQueryAndRefData for ScoreStarts<T> {
#[inline]
fn invert(self) -> Self {
Self {
score: self.score,
ref_start: self.query_start,
query_start: self.ref_start,
}
}
}
impl<T> HasQueryAndRefData for ScoreEnds<T> {
#[inline]
fn invert(self) -> Self {
Self {
score: self.score,
ref_end: self.query_end,
query_end: self.ref_end,
}
}
}
impl<T> HasQueryAndRefData for ScoreAndRanges<T> {
fn invert(self) -> Self {
Self {
score: self.score,
ref_range: self.query_range,
query_range: self.ref_range,
}
}
}
impl<T> HasQueryAndRefData for MaybeAligned<T>
where
T: HasQueryAndRefData,
{
#[inline]
fn invert(self) -> Self {
self.map(HasQueryAndRefData::invert)
}
}
impl<T> HasQueryAndRefData for Option<T>
where
T: HasQueryAndRefData,
{
#[inline]
fn invert(self) -> Self {
self.map(HasQueryAndRefData::invert)
}
}
impl<T, E> HasQueryAndRefData for Result<T, E>
where
T: HasQueryAndRefData,
{
#[inline]
fn invert(self) -> Self {
self.map(HasQueryAndRefData::invert)
}
}
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub enum SeqSrc<T> {
Query(T),
Reference(T),
}
impl<T> SeqSrc<T> {
#[inline]
#[must_use]
pub(crate) fn make_alignment<F, A>(self, f: F) -> A
where
F: FnOnce(T) -> A,
A: HasQueryAndRefData, {
let (seq, invert) = match self {
SeqSrc::Query(seq) => (seq, true),
SeqSrc::Reference(seq) => (seq, false),
};
let alignment = f(seq);
if invert { alignment.invert() } else { alignment }
}
#[inline]
#[must_use]
pub fn map<U, F>(self, f: F) -> SeqSrc<U>
where
F: FnOnce(T) -> U, {
match self {
SeqSrc::Query(seq) => SeqSrc::Query(f(seq)),
SeqSrc::Reference(seq) => SeqSrc::Reference(f(seq)),
}
}
#[inline]
#[must_use]
pub fn is_query(&self) -> bool {
matches!(self, SeqSrc::Query(_))
}
#[inline]
#[must_use]
pub fn is_reference(&self) -> bool {
matches!(self, SeqSrc::Reference(_))
}
}
pub trait AsSeqSrc {
#[inline]
#[must_use]
fn as_query_src(&self) -> SeqSrc<&Self> {
SeqSrc::Query(self)
}
#[inline]
#[must_use]
fn as_ref_src(&self) -> SeqSrc<&Self> {
SeqSrc::Reference(self)
}
}
impl<T: AsRef<[u8]>> AsSeqSrc for T {}
pub trait IntoSeqSrc: Sized {
#[inline]
#[must_use]
fn into_query_src(self) -> SeqSrc<Self> {
SeqSrc::Query(self)
}
#[inline]
#[must_use]
fn into_ref_src(self) -> SeqSrc<Self> {
SeqSrc::Reference(self)
}
}
impl<T: AsRef<[u8]>> IntoSeqSrc for T {}