pub struct ParallelNode<I, O, C>{
pub nodes: Vec<Box<dyn Node<Input = I, Output = O> + Send + Sync>>,
pub function: Box<dyn Fn(Vec<O>) -> BoxFuture<'static, Result<C, AnchorChainError>> + Send + Sync>,
}Expand description
A node that processes input through multiple nodes in parallel.
The ParallelNode struct represents a node that processes input through
multiple nodes in parallel. The output of each node is then combined using
a provided function to produce the final output.
Fields§
§nodes: Vec<Box<dyn Node<Input = I, Output = O> + Send + Sync>>The nodes that will process the input in parallel.
function: Box<dyn Fn(Vec<O>) -> BoxFuture<'static, Result<C, AnchorChainError>> + Send + Sync>The function to process the output of the nodes.
Implementations§
Source§impl<I, O, C> ParallelNode<I, O, C>
impl<I, O, C> ParallelNode<I, O, C>
Sourcepub fn new(
nodes: Vec<Box<dyn Node<Input = I, Output = O> + Send + Sync>>,
function: Box<dyn Fn(Vec<O>) -> BoxFuture<'static, Result<C, AnchorChainError>> + Send + Sync>,
) -> Self
pub fn new( nodes: Vec<Box<dyn Node<Input = I, Output = O> + Send + Sync>>, function: Box<dyn Fn(Vec<O>) -> BoxFuture<'static, Result<C, AnchorChainError>> + Send + Sync>, ) -> Self
Creates a new ParallelNode with the provided nodes and combination
function.
The combination function can be defined using the helper function to_boxed_future.
§Example
// Using PassThroughNode as an example node
use anchor_chain::{
node::NoOpNode,
parallel_node::ParallelNode,
parallel_node::to_boxed_future
};
#[tokio::main]
async fn main() {
let node1 = Box::new(NoOpNode::new());
let node2 = Box::new(NoOpNode::new());
let concat_fn = to_boxed_future(|outputs: Vec<String>| {
Ok(outputs
.iter()
.enumerate()
.map(|(i, output)| format!("Output {}:\n```\n{}\n```\n", i + 1, output))
.collect::<Vec<String>>()
.concat())
});
let parallel_node = ParallelNode::new(vec![node1, node2], concat_fn);
}Trait Implementations§
Source§impl<I, O, C> Debug for ParallelNode<I, O, C>
impl<I, O, C> Debug for ParallelNode<I, O, C>
Source§impl<I, O, C> Node for ParallelNode<I, O, C>
impl<I, O, C> Node for ParallelNode<I, O, C>
Source§fn process<'life0, 'async_trait>(
&'life0 self,
input: Self::Input,
) -> Pin<Box<dyn Future<Output = Result<Self::Output, AnchorChainError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn process<'life0, 'async_trait>(
&'life0 self,
input: Self::Input,
) -> Pin<Box<dyn Future<Output = Result<Self::Output, AnchorChainError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Processes the given input through nodes in parallel.
The input is processed by each node in parallel, and the results are combined using the provided function to produce the final output.
Auto Trait Implementations§
impl<I, O, C> Freeze for ParallelNode<I, O, C>
impl<I, O, C> !RefUnwindSafe for ParallelNode<I, O, C>
impl<I, O, C> Send for ParallelNode<I, O, C>
impl<I, O, C> Sync for ParallelNode<I, O, C>
impl<I, O, C> Unpin for ParallelNode<I, O, C>
impl<I, O, C> !UnwindSafe for ParallelNode<I, O, C>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreCreates a shared type from an unshared type.