use crate::{
chemistry::{MassMode, MolecularFormula, MultiChemical},
fragment::SatelliteLabel,
quantities::Multi,
sequence::SequencePosition,
system::Mass,
};
use std::borrow::Cow;
pub trait IsAminoAcid: MultiChemical {
fn name(&self) -> Cow<'_, str>;
fn three_letter_code(&self) -> Option<Cow<'_, str>>;
#[doc(alias = "code")]
fn one_letter_code(&self) -> Option<char>;
fn pro_forma_definition(&self) -> Cow<'_, str>;
fn monoisotopic_mass(&self) -> Cow<'_, Multi<Mass>> {
Cow::Owned(
self.formulas()
.iter()
.map(MolecularFormula::monoisotopic_mass)
.collect(),
)
}
fn average_weight(&self) -> Cow<'_, Multi<Mass>> {
Cow::Owned(
self.formulas()
.iter()
.map(MolecularFormula::average_weight)
.collect(),
)
}
fn mass(&self, mode: MassMode) -> Cow<'_, Multi<Mass>> {
Cow::Owned(self.formulas().iter().map(|f| f.mass(mode)).collect())
}
fn side_chain(
&self,
sequence_index: SequencePosition,
peptidoform_index: usize,
peptidoform_ion_index: usize,
) -> Cow<'_, Multi<MolecularFormula>>;
fn satellite_ion_fragments(
&self,
sequence_index: SequencePosition,
peptidoform_index: usize,
peptidoform_ion_index: usize,
) -> Option<Cow<'_, [(SatelliteLabel, MolecularFormula)]>>;
}