use std::fmt;
use rand::Rng;
use rand::distributions::{Distribution, Uniform, Bernoulli};
#[derive(Clone)]
pub struct Person {
pub floor_on: usize,
pub floor_to: usize,
pub is_leaving: bool,
pub wait_time: usize,
pub p_out: f64,
pub p_tip: f64,
dst_out: Bernoulli,
dst_tip: Bernoulli
}
impl Person {
pub fn from(p_out: f64, p_tip: f64, num_floors: usize, mut rng: &mut impl Rng) -> Person {
let dst_to = Uniform::new(0_usize, num_floors);
let floor_to: usize = dst_to.sample(&mut rng);
Person {
floor_on: 0_usize,
floor_to: floor_to,
is_leaving: false,
wait_time: 0_usize,
p_out: p_out,
dst_out: Bernoulli::new(p_out).unwrap(),
p_tip: p_tip,
dst_tip: Bernoulli::new(p_tip).unwrap()
}
}
pub fn gen_is_leaving(&mut self, mut rng: &mut impl Rng) -> bool {
if self.is_leaving {
return self.is_leaving;
}
let pers_is_leaving: bool = self.dst_out.sample(&mut rng);
if pers_is_leaving {
self.floor_to = 0_usize;
self.is_leaving = pers_is_leaving;
}
self.is_leaving
}
pub fn gen_tip(&self, mut rng: &mut impl Rng) -> bool {
self.dst_tip.sample(&mut rng)
}
pub fn increment_wait_time(&mut self) {
self.wait_time += 1_usize;
}
pub fn reset_wait_time(&mut self) {
self.wait_time = 0_usize;
}
}
impl fmt::Display for Person {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let display_str: String = if self.floor_on != self.floor_to {
format!("Person {} -> {}", self.floor_on, self.floor_to)
} else {
format!("Person {}", self.floor_on)
};
f.write_str(&display_str)
}
}