1use std::future::Future;
2use std::marker::PhantomData;
3
4use async_trait::async_trait;
5use synaptic_core::SynapseError;
6
7use crate::State;
8
9#[async_trait]
11pub trait Node<S: State>: Send + Sync {
12 async fn process(&self, state: S) -> Result<S, SynapseError>;
13}
14
15pub 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}