use std::collections::HashMap;
use crate::{prelude::RailwayGraph, types::RailwayObjectId};
use super::SimulationObject;
pub trait ObservableEnvironment {
fn get_graph(&self) -> &RailwayGraph;
fn get_objects(&self) -> Vec<&dyn SimulationObject>;
fn get_object(&self, id: &RailwayObjectId) -> Option<&dyn SimulationObject>;
}
pub trait ObservableEnvironmentRef {
fn as_observable_env(&self) -> &(dyn ObservableEnvironment + 'static);
}
#[derive(Debug)]
pub struct SimulationEnvironment {
pub graph: RailwayGraph,
pub objects: HashMap<i64, Box<dyn SimulationObject>>,
}
impl ObservableEnvironment for SimulationEnvironment {
fn get_graph(&self) -> &RailwayGraph {
&self.graph
}
fn get_objects(&self) -> Vec<&dyn SimulationObject> {
self.objects
.values()
.map(|object| object.as_ref())
.collect()
}
fn get_object(&self, id: &RailwayObjectId) -> Option<&dyn SimulationObject> {
self.objects.get(id).map(|boxed| &**boxed)
}
}
impl ObservableEnvironmentRef for SimulationEnvironment {
fn as_observable_env(&self) -> &(dyn ObservableEnvironment + 'static) {
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::tests::test_graph_vilbel;
#[test]
fn test_environment() {
let graph = test_graph_vilbel();
let environment = SimulationEnvironment {
graph: graph.clone(),
objects: HashMap::<i64, Box<dyn SimulationObject>>::default(),
};
assert_eq!(environment.graph, graph);
}
#[test]
fn test_get_objects() {
let graph = test_graph_vilbel();
let mut environment = SimulationEnvironment {
graph: graph.clone(),
objects: HashMap::<i64, Box<dyn SimulationObject>>::default(),
};
let objects = environment.get_objects();
assert_eq!(objects.len(), 0);
let train = crate::railway_objects::Train::default();
environment.objects.insert(0, Box::new(train));
let objects = environment.get_objects();
assert_eq!(objects.len(), 1);
}
}