use crate::{Duration, RouteIncomingMotion, RouteTransition, Timeline};
#[derive(Debug, Clone, PartialEq)]
pub struct RouteScreenTransition<R>
where
R: Copy + Eq,
{
from: R,
to: R,
outgoing: Timeline,
incoming: Timeline,
}
impl<R> RouteScreenTransition<R>
where
R: Copy + Eq,
{
#[must_use]
pub const fn new(from: R, to: R, outgoing: Timeline, incoming: Timeline) -> Self {
Self {
from,
to,
outgoing,
incoming,
}
}
#[must_use]
pub fn with_incoming_motion(
from: R,
to: R,
outgoing: Timeline,
incoming: RouteIncomingMotion,
) -> Self {
Self::new(from, to, outgoing, incoming.timeline())
}
#[must_use]
pub const fn from(&self) -> R {
self.from
}
#[must_use]
pub const fn to(&self) -> R {
self.to
}
#[must_use]
pub const fn outgoing(&self) -> &Timeline {
&self.outgoing
}
#[must_use]
pub const fn incoming(&self) -> &Timeline {
&self.incoming
}
#[must_use]
pub fn total_duration(&self) -> Option<Duration> {
Some(
self.outgoing
.total_duration()?
.max(self.incoming.total_duration()?),
)
}
#[must_use]
pub fn outgoing_shorter(&self) -> Option<bool> {
Some(self.outgoing.total_duration()? <= self.incoming.total_duration()?)
}
pub(crate) fn route_transition(&self) -> RouteTransition<R> {
RouteTransition::new(
self.from,
self.to,
Timeline::hold(self.total_duration().unwrap_or(Duration::ZERO)),
)
}
}