use crate::models::TemporalInjection;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Sample {
pub injections: HashMap<Option<String>, TemporalInjection>,
}
impl Sample {
pub fn empty() -> Self {
Self {
injections: HashMap::new(),
}
}
pub fn uniform(injection: TemporalInjection) -> Self {
let mut injections = HashMap::new();
injections.insert(None, injection);
Self { injections }
}
pub fn set_default(&mut self, injection: TemporalInjection) {
self.injections.insert(None, injection);
}
pub fn set_species(&mut self, name: &str, injection: TemporalInjection) {
self.injections.insert(Some(name.to_string()), injection);
}
pub fn default_injection(&self) -> Option<&TemporalInjection> {
self.injections.get(&None)
}
pub fn species_injection(&self, name: &str) -> Option<&TemporalInjection> {
self.injections.get(&Some(name.to_string()))
}
pub fn is_empty(&self) -> bool {
self.injections.is_empty()
}
pub fn as_map(&self) -> &HashMap<Option<String>, TemporalInjection> {
&self.injections
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sample_empty() {
let sample = Sample::empty();
assert!(sample.is_empty());
assert!(sample.default_injection().is_none());
}
#[test]
fn test_sample_uniform() {
let sample = Sample::uniform(TemporalInjection::gaussian(10.0, 2.0, 0.1));
assert!(!sample.is_empty());
assert!(sample.default_injection().is_some());
}
#[test]
fn test_sample_set_default() {
let mut sample = Sample::empty();
sample.set_default(TemporalInjection::dirac(5.0, 0.1));
assert!(sample.default_injection().is_some());
}
#[test]
fn test_sample_set_species() {
let mut sample = Sample::uniform(TemporalInjection::gaussian(10.0, 2.0, 0.1));
sample.set_species("B", TemporalInjection::rectangle(5.0, 15.0, 0.05));
assert!(sample.species_injection("B").is_some());
assert!(sample.species_injection("A").is_none());
}
#[test]
fn test_sample_as_map_compatible_with_set_injections() {
let mut sample = Sample::uniform(TemporalInjection::dirac(5.0, 0.1));
sample.set_species("Malic", TemporalInjection::gaussian(10.0, 2.0, 0.05));
let map = sample.as_map();
assert!(map.contains_key(&None));
assert!(map.contains_key(&Some("Malic".to_string())));
assert_eq!(map.len(), 2);
}
}