-
Notifications
You must be signed in to change notification settings - Fork 339
Closed
Description
I suggest adding the following iterator
#[derive(Clone, Debug)]
struct ExponentialAverageIter<T, I> {
last_item: Option<T>,
iter: I,
smoothing_factor: f64,
}
impl<T, I> Iterator for ExponentialAverageIter<T, I>
where
T: Mul<f64, Output = T> + Add<Output = T> + Clone,
I: Iterator<Item = T>,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.iter
.next()
.map(|item| match self.last_item.take() {
Some(rhs) => item * self.smoothing_factor + rhs * (self.smoothing_factor - 1.),
None => item,
})
.inspect(|item| self.last_item = Some(item.clone()))
}
}
trait Itertools: Iterator {
fn exponential_average(self, smoothing_factor: f64) -> ExponentialAverageIter<Self::Item, Self>
where
Self: Sized,
{
ExponentialAverageIter {
last_item: None,
iter: self,
smoothing_factor,
}
}
}Metadata
Metadata
Assignees
Labels
No labels