use dyn_any::StaticType; pub use graph_craft::proto::{Any, NodeContainer, TypeErasedBox, TypeErasedNode}; use graph_craft::proto::{DynFuture, FutureAny, SharedNodeContainer}; use graphene_core::NodeIO; use graphene_core::WasmNotSend; pub use graphene_core::registry::{DowncastBothNode, DynAnyNode, FutureWrapperNode, PanicNode}; pub use graphene_core::{Node, generic, ops}; pub trait IntoTypeErasedNode<'n> { fn into_type_erased(self) -> TypeErasedBox<'n>; } impl<'n, N: 'n> IntoTypeErasedNode<'n> for N where N: for<'i> NodeIO<'i, Any<'i>, Output = FutureAny<'i>> + Sync + WasmNotSend, { fn into_type_erased(self) -> TypeErasedBox<'n> { Box::new(self) } } pub struct ComposeTypeErased { first: SharedNodeContainer, second: SharedNodeContainer, } impl<'i> Node<'i, Any<'i>> for ComposeTypeErased { type Output = DynFuture<'i, Any<'i>>; fn eval(&'i self, input: Any<'i>) -> Self::Output { Box::pin(async move { let arg = self.first.eval(input).await; self.second.eval(arg).await }) } } impl ComposeTypeErased { pub const fn new(first: SharedNodeContainer, second: SharedNodeContainer) -> Self { ComposeTypeErased { first, second } } } pub fn input_node(n: SharedNodeContainer) -> DowncastBothNode<(), O> { downcast_node(n) } pub fn downcast_node(n: SharedNodeContainer) -> DowncastBothNode { DowncastBothNode::new(n) }