|
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<O: StaticType>(n: SharedNodeContainer) -> DowncastBothNode<(), O> { |
|
downcast_node(n) |
|
} |
|
pub fn downcast_node<I: StaticType, O: StaticType>(n: SharedNodeContainer) -> DowncastBothNode<I, O> { |
|
DowncastBothNode::new(n) |
|
} |
|
|