use std::iter;
use super::ArrivalBound;
use crate::time::Duration;
pub struct Propagated<T: ArrivalBound> {
pub response_time_jitter: Duration,
pub input_event_model: T,
}
impl<T: ArrivalBound + Clone> Propagated<T> {
pub fn with_jitter(event_model: &T, response_time_jitter: Duration) -> Self {
Propagated {
input_event_model: event_model.clone(),
response_time_jitter,
}
}
}
impl<T: ArrivalBound + Clone + 'static> ArrivalBound for Propagated<T> {
fn number_arrivals(&self, delta: Duration) -> usize {
if delta.is_non_zero() {
self.input_event_model
.number_arrivals(delta + self.response_time_jitter)
} else {
0
}
}
fn steps_iter<'a>(&'a self) -> Box<dyn Iterator<Item = Duration> + 'a> {
Box::new(
iter::once(Duration::from(1)).chain(
self.input_event_model
.steps_iter()
.filter(move |x| *x > self.response_time_jitter + Duration::from(1))
.map(move |x| x - self.response_time_jitter),
),
)
}
fn clone_with_jitter(&self, added_jitter: Duration) -> Box<dyn ArrivalBound> {
Box::new(Propagated {
response_time_jitter: self.response_time_jitter + added_jitter,
input_event_model: self.input_event_model.clone(),
})
}
}