use std::fmt;
use opensmiles::Molecule;
use super::stochastic_object::StochasticObject;
#[derive(Debug, Clone, PartialEq)]
pub enum BigSmilesSegment {
Smiles(Molecule),
Stochastic(StochasticObject),
}
#[derive(Debug, Clone, PartialEq)]
pub struct BigSmiles {
pub segments: Vec<BigSmilesSegment>,
}
impl BigSmiles {
pub fn first_stochastic(&self) -> Option<&StochasticObject> {
self.segments.iter().find_map(|seg| match seg {
BigSmilesSegment::Stochastic(obj) => Some(obj),
_ => None,
})
}
pub fn prefix_segments(&self) -> &[BigSmilesSegment] {
match self
.segments
.iter()
.position(|s| matches!(s, BigSmilesSegment::Stochastic(_)))
{
Some(i) => &self.segments[..i],
None => &[],
}
}
pub fn suffix_segments(&self) -> &[BigSmilesSegment] {
match self
.segments
.iter()
.rposition(|s| matches!(s, BigSmilesSegment::Stochastic(_)))
{
Some(i) => &self.segments[i + 1..],
None => &[],
}
}
}
impl fmt::Display for BigSmiles {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for seg in &self.segments {
match seg {
BigSmilesSegment::Smiles(mol) => write!(f, "{}", mol)?,
BigSmilesSegment::Stochastic(obj) => write!(f, "{}", obj)?,
}
}
Ok(())
}
}