#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SequenceEntry {
pub name: String,
pub sequence: String,
pub weight: f64,
}
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SequenceLibrary {
entries: Vec<SequenceEntry>,
}
impl SequenceLibrary {
pub fn new() -> Self {
Self::default()
}
pub fn add(&mut self, name: impl Into<String>, sequence: impl Into<String>) {
self.entries.push(SequenceEntry {
name: name.into(),
sequence: sequence.into(),
weight: 1.0,
});
}
pub fn add_weighted(
&mut self,
name: impl Into<String>,
sequence: impl Into<String>,
weight: f64,
) {
self.entries.push(SequenceEntry { name: name.into(), sequence: sequence.into(), weight });
}
pub fn len(&self) -> usize {
self.entries.len()
}
pub fn is_empty(&self) -> bool {
self.entries.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = &SequenceEntry> {
self.entries.iter()
}
}
impl FromIterator<(String, String)> for SequenceLibrary {
fn from_iter<I: IntoIterator<Item = (String, String)>>(iter: I) -> Self {
Self {
entries: iter
.into_iter()
.map(|(name, sequence)| SequenceEntry { name, sequence, weight: 1.0 })
.collect(),
}
}
}
impl FromIterator<(String, String, f64)> for SequenceLibrary {
fn from_iter<I: IntoIterator<Item = (String, String, f64)>>(iter: I) -> Self {
Self {
entries: iter
.into_iter()
.map(|(name, sequence, weight)| SequenceEntry { name, sequence, weight })
.collect(),
}
}
}