use super::traits::{NodeArg, TaskNode};
use super::transition::{
AnyJoinInput, AnyJoinTarget, JoinInput, JoinTarget, MarkedTransition, Transition,
};
#[derive(PartialEq, Eq)]
pub struct NodeId<T: TaskNode + ?Sized> {
id: usize,
_marker: std::marker::PhantomData<T>,
}
impl<T: TaskNode + ?Sized> std::fmt::Debug for NodeId<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let type_name = std::any::type_name::<T>();
write!(f, "NodeId<{type_name}>({})", self.id)
}
}
impl<T: TaskNode + ?Sized> NodeId<T> {
pub fn id(&self) -> usize {
self.id
}
pub fn transitions_with(&self, context: T::Input) -> MarkedTransition<T> {
Transition::next(self, context)
}
}
impl<T, Payload> NodeId<T>
where
T: TaskNode<Input = JoinInput<Payload>> + ?Sized,
Payload: NodeArg,
{
pub fn join(&self) -> JoinTarget<T, Payload> {
JoinTarget::new(*self)
}
}
impl<T> NodeId<T>
where
T: TaskNode<Input = AnyJoinInput> + ?Sized,
{
pub fn join_any(&self) -> AnyJoinTarget<T> {
AnyJoinTarget::new(*self)
}
}
impl<T: TaskNode + 'static + ?Sized> NodeId<T> {
pub fn new(id: usize, _node: &T) -> Self {
NodeId {
id,
_marker: std::marker::PhantomData,
}
}
pub fn as_dyn(
self,
) -> NodeId<dyn TaskNode<Input = T::Input, Output = T::Output, Error = T::Error>> {
NodeId {
id: self.id,
_marker: std::marker::PhantomData,
}
}
}
impl<T: TaskNode + ?Sized> Clone for NodeId<T> {
fn clone(&self) -> Self {
*self
}
}
impl<T: TaskNode + ?Sized> Copy for NodeId<T> {}