use std::ops::Add;
use crate::*;
use crate::iter::*;
pub trait TimeTranslation<TW>: TimeConvexIterator
{
type Output:TimeConvexIterator<TimePoint=Self::TimePoint>;
fn translation(self, tw: TW) -> Self::Output;
}
impl<I:TimeConvexIterator> TimeTranslation<TimeValue> for I
where
I::Item: Add<TimeValue,Output=I::Item>
{
type Output = TimeValueTranslIter<I>;
fn translation(self, t: TimeValue) -> Self::Output {
TimeValueTranslIter{ t, iter: self }
}
}
pub struct TimeValueTranslIter<I:TimeConvexIterator> {
t: TimeValue,
iter: I
}
impl<I:TimeConvexIterator> Iterator for TimeValueTranslIter<I>
where
I::Item: Add<TimeValue,Output=I::Item>
{
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|tw| tw+self.t)
.and_then(|tw| if tw.is_empty() { None } else { Some(tw) })
}
}
impl<I:TimeConvexIterator> TimeConvexIterator for TimeValueTranslIter<I>
where
I::Item: Add<TimeValue,Output=I::Item>
{
type TimePoint = I::TimePoint;
}
impl<I:TimeConvexIterator> TimeTranslation<&TimeSpan> for I
where
I::Item: Add<TimeSpan,Output=I::Item>
{
type Output = crate::iter::intoiter::IntoConvexIter<I::TimePoint,std::vec::IntoIter<TimeInterval<I::TimePoint>>>;
fn translation(self, ts: &TimeSpan) -> Self::Output {
let tw = self.fold(TimeSet::<I::TimePoint>::empty(), |r,tw| r | (tw + *ts));
tw.into_iter()
}
}