use std::ops::Deref;
use crate::{Editable, SimulationInfo};
pub enum DynamicSimulation<S: SimulationInfo, E: Editable> {
Default(S),
Simulated(E),
}
impl<S: SimulationInfo, E: Editable> DynamicSimulation<S, E> {
pub fn default(&self) -> Option<&S> {
if let Self::Default(info) = self {
Some(info)
} else {
None
}
}
pub fn default_mut(&mut self) -> Option<&mut S> {
if let Self::Default(info) = self {
Some(info)
} else {
None
}
}
pub fn simulated(&self) -> Option<&E> {
if let Self::Simulated(sim) = self {
Some(sim)
} else {
None
}
}
pub fn simulated_mut(&mut self) -> Option<&mut E> {
if let Self::Simulated(sim) = self {
Some(sim)
} else {
None
}
}
}
impl<S: SimulationInfo, E: Editable + Deref<Target = S>> Deref for DynamicSimulation<S, E> {
type Target = S;
fn deref(&self) -> &S {
match self {
Self::Default(info) => info,
Self::Simulated(sim) => sim,
}
}
}
impl<S: SimulationInfo, E: Editable> From<S> for DynamicSimulation<S, E> {
fn from(info: S) -> Self {
Self::Default(info)
}
}