Skip to main content

synaptic_graph/
node.rs

1use std::future::Future;
2use std::marker::PhantomData;
3
4use async_trait::async_trait;
5use synaptic_core::SynapseError;
6
7use crate::State;
8
9/// A node in the graph that processes state.
10#[async_trait]
11pub trait Node<S: State>: Send + Sync {
12    async fn process(&self, state: S) -> Result<S, SynapseError>;
13}
14
15/// Wraps an async function as a Node.
16pub struct FnNode<S, F, Fut>
17where
18    S: State,
19    F: Fn(S) -> Fut + Send + Sync,
20    Fut: Future<Output = Result<S, SynapseError>> + Send,
21{
22    func: F,
23    _marker: PhantomData<S>,
24}
25
26impl<S, F, Fut> FnNode<S, F, Fut>
27where
28    S: State,
29    F: Fn(S) -> Fut + Send + Sync,
30    Fut: Future<Output = Result<S, SynapseError>> + Send,
31{
32    pub fn new(func: F) -> Self {
33        Self {
34            func,
35            _marker: PhantomData,
36        }
37    }
38}
39
40#[async_trait]
41impl<S, F, Fut> Node<S> for FnNode<S, F, Fut>
42where
43    S: State,
44    F: Fn(S) -> Fut + Send + Sync,
45    Fut: Future<Output = Result<S, SynapseError>> + Send,
46{
47    async fn process(&self, state: S) -> Result<S, SynapseError> {
48        (self.func)(state).await
49    }
50}