use crate::context::Context;
use crate::error::FloxideError;
use crate::node::Node;
use crate::transition::Transition;
use async_trait::async_trait;
use std::marker::PhantomData;
#[derive(Clone, Debug)]
pub struct SplitNode<I, O, F>
where
F: Fn(I) -> Vec<O> + Send + Sync,
{
splitter: F,
_phantom: PhantomData<(I, O)>,
}
impl<I, O, F> SplitNode<I, O, F>
where
F: Fn(I) -> Vec<O> + Send + Sync,
{
pub fn new(splitter: F) -> Self {
SplitNode {
splitter,
_phantom: PhantomData,
}
}
}
#[async_trait]
impl<C, I, O, F> Node<C> for SplitNode<I, O, F>
where
C: Context,
I: Send + Sync + 'static,
O: Send + Sync + 'static,
F: Fn(I) -> Vec<O> + Send + Sync,
{
type Input = I;
type Output = O;
async fn process(&self, _ctx: &C, input: I) -> Result<Transition<O>, FloxideError> {
let outputs = (self.splitter)(input);
Ok(Transition::NextAll(outputs))
}
}