use crate::elevator::Elevator;
use crate::person::Person;
use crate::people::People;
pub trait Elevators {
fn get_dest_floors(&self) -> Vec<usize>;
fn get_energy_spent(&mut self) -> f64;
fn flush_people_leaving_elevators(&mut self) -> Vec<Vec<Person>>;
fn update_floors(&mut self);
fn increment_wait_times(&mut self);
fn append_elevator(&mut self, energy_up: f64, energy_down: f64, energy_coef: f64);
}
impl Elevators for Vec<Elevator> {
fn get_dest_floors(&self) -> Vec<usize> {
let mut dest_floors: Vec<usize> = Vec::new();
for elevator in self.iter() {
let elevator_dest_floors: Vec<usize> = elevator.get_dest_floors();
for dest_floor in elevator_dest_floors.iter() {
if dest_floors.contains(dest_floor) {
continue;
}
dest_floors.push(*dest_floor);
}
}
dest_floors
}
fn get_energy_spent(&mut self) -> f64 {
let mut energy_spent: f64 = 0.0_f64;
for elevator in self.iter_mut() {
let elevator_energy_spent: f64 = elevator.get_energy_spent();
energy_spent += elevator_energy_spent;
}
energy_spent
}
fn flush_people_leaving_elevators(&mut self) -> Vec<Vec<Person>> {
let mut people_leaving_elevators: Vec<Vec<Person>> = Vec::new();
for elevator in self.iter_mut() {
let people_leaving_elevator: Vec<Person> = elevator.flush_people_leaving_elevator();
people_leaving_elevators.push(people_leaving_elevator);
}
people_leaving_elevators
}
fn update_floors(&mut self) {
for elevator in self.iter_mut() {
elevator.update_floor();
}
}
fn increment_wait_times(&mut self) {
for elevator in self.iter_mut() {
elevator.increment_wait_times();
}
}
fn append_elevator(&mut self, energy_up: f64, energy_down: f64, energy_coef: f64) {
self.push(Elevator::from(energy_up, energy_down, energy_coef));
}
}