use derive_new::new;
use std::boxed::Box;
use std::rc::Rc;
use crate::types::*;
#[derive(new)]
pub(crate) struct ConsumerNode<IN> {
upstream: Rc<dyn Stream<IN>>,
func: Box<dyn Fn(IN, NanoTime)>,
}
impl<IN> MutableNode for ConsumerNode<IN> {
fn cycle(&mut self, state: &mut GraphState) -> anyhow::Result<bool> {
(self.func)(self.upstream.peek_value(), state.time());
Ok(true)
}
fn upstreams(&self) -> UpStreams {
UpStreams::new(vec![self.upstream.clone().as_node()], vec![])
}
}
#[derive(new)]
pub(crate) struct TryConsumerNode<IN> {
upstream: Rc<dyn Stream<IN>>,
func: Box<dyn Fn(IN, NanoTime) -> anyhow::Result<()>>,
}
impl<IN> MutableNode for TryConsumerNode<IN> {
fn cycle(&mut self, state: &mut GraphState) -> anyhow::Result<bool> {
(self.func)(self.upstream.peek_value(), state.time())?;
Ok(true)
}
fn upstreams(&self) -> UpStreams {
UpStreams::new(vec![self.upstream.clone().as_node()], vec![])
}
}