mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-07-08 00:05:00 +00:00
65 lines
1.7 KiB
Rust
65 lines
1.7 KiB
Rust
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)
|
|
}
|
|
|
|
pub struct IdentityNode {
|
|
value: SharedNodeContainer,
|
|
}
|
|
|
|
impl<'i> Node<'i, Any<'i>> for IdentityNode {
|
|
type Output = DynFuture<'i, Any<'i>>;
|
|
fn eval(&'i self, input: Any<'i>) -> Self::Output {
|
|
Box::pin(async move { self.value.eval(input).await })
|
|
}
|
|
}
|
|
|
|
impl IdentityNode {
|
|
pub const fn new(value: SharedNodeContainer) -> Self {
|
|
IdentityNode { value }
|
|
}
|
|
}
|