use crate::alignment::phmm::{
CorePhmm, LayerParams,
indexing::{PhmmIndex, PhmmIndexRange, PhmmIndexable},
};
use std::slice::GetDisjointMutError;
pub trait GetModule {
type Begin;
type End;
#[must_use]
fn begin(&self) -> &Self::Begin;
#[must_use]
fn end(&self) -> &Self::End;
}
#[allow(dead_code)]
pub trait GetModuleMut: GetModule {
#[must_use]
fn begin_mut(&mut self) -> &mut Self::Begin;
#[must_use]
fn end_mut(&mut self) -> &mut Self::End;
}
pub(crate) trait GetCore<T, const S: usize> {
#[must_use]
fn core(&self) -> &CorePhmm<T, S>;
}
pub(crate) trait GetCoreMut<T, const S: usize> {
#[must_use]
#[allow(dead_code)]
fn core_mut(&mut self) -> &mut CorePhmm<T, S>;
}
#[allow(dead_code)]
pub trait GetLayer<T, const S: usize>: PhmmIndexable {
#[must_use]
fn layers(&self) -> &[LayerParams<T, S>];
#[must_use]
fn split_last_layer(&self) -> (&LayerParams<T, S>, &[LayerParams<T, S>]);
#[inline]
#[must_use]
fn begin_layer(&self) -> &LayerParams<T, S> {
&self.layers()[0]
}
#[inline]
#[must_use]
fn first_match(&self) -> &LayerParams<T, S> {
&self.layers()[1]
}
#[inline]
#[must_use]
fn last_match(&self) -> &LayerParams<T, S> {
&self.layers()[self.layers().len() - 1]
}
#[inline]
#[must_use]
fn get_layer(&self, j: impl PhmmIndex) -> Option<&LayerParams<T, S>> {
self.layers().get(self.get_dp_index(j))
}
#[inline]
#[must_use]
fn get_layers(&self, range: impl PhmmIndexRange) -> Option<&[LayerParams<T, S>]> {
self.layers().get(self.get_dp_range(range))
}
}
#[allow(dead_code)]
pub trait GetLayerMut<T, const S: usize>: GetLayer<T, S> {
#[must_use]
fn layers_mut(&mut self) -> &mut [LayerParams<T, S>];
#[must_use]
fn layers_mut_vec(&mut self) -> &mut Vec<LayerParams<T, S>>;
#[inline]
#[must_use]
fn begin_layer_mut(&mut self) -> &mut LayerParams<T, S> {
&mut self.layers_mut()[0]
}
#[inline]
#[must_use]
fn first_match_mut(&mut self) -> &mut LayerParams<T, S> {
&mut self.layers_mut()[1]
}
#[inline]
#[must_use]
fn last_match_mut(&mut self) -> &mut LayerParams<T, S> {
let idx = self.layers().len() - 1;
&mut self.layers_mut()[idx]
}
#[inline]
#[must_use]
fn get_layer_mut(&mut self, j: impl PhmmIndex) -> Option<&mut LayerParams<T, S>> {
let idx = self.get_dp_index(j);
self.layers_mut().get_mut(idx)
}
#[inline]
#[must_use]
fn get_layers_mut(&mut self, range: impl PhmmIndexRange) -> Option<&mut [LayerParams<T, S>]> {
let range = self.get_dp_range(range);
self.layers_mut().get_mut(range)
}
#[inline]
fn get_two_layers_mut(
&mut self, j1: impl PhmmIndex, j2: impl PhmmIndex,
) -> Result<(&mut LayerParams<T, S>, &mut LayerParams<T, S>), GetDisjointMutError> {
let j1 = self.get_dp_index(j1);
let j2 = self.get_dp_index(j2);
let [l1, l2] = self.layers_mut().get_disjoint_mut([j1, j2])?;
Ok((l1, l2))
}
}
pub trait GetPartsMut<T, const S: usize>: GetModule + GetLayer<T, S> {
#[must_use]
fn parts_mut(&mut self) -> (&mut CorePhmm<T, S>, &mut Self::Begin, &mut Self::End);
}