use crate::elevator::Elevator;
use crate::people::People;
pub trait Elevators {
fn get_dest_floors(&self) -> Vec<usize>;
fn get_energy_spent(&mut self) -> f64;
fn update_floors(&mut self);
fn increment_wait_times(&mut self);
fn append_elevator(&mut self, capacity: usize, energy_up: f64, energy_down: f64, energy_coef: f64);
fn update_capacities(&mut self, capacity: usize);
}
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 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, capacity: usize, energy_up: f64, energy_down: f64, energy_coef: f64) {
self.push(Elevator::from(capacity, energy_up, energy_down, energy_coef));
}
fn update_capacities(&mut self, capacity: usize) {
let can_update_capacities: bool = {
let mut tmp_can_update_capacities: bool = true;
for elevator in self.iter() {
if capacity < elevator.get_num_people() {
tmp_can_update_capacities = false;
break;
}
}
tmp_can_update_capacities
};
if can_update_capacities {
for elevator in self.iter_mut() {
elevator.capacity = capacity;
}
}
}
}