wingfoil 3.0.1

graph based stream processing framework
Documentation
use derive_new::new;

use std::boxed::Box;
use std::rc::Rc;

use crate::types::*;

/// When triggered by it's source, it produces values
/// using the supplied closure.
#[derive(new)]
pub(crate) struct ProducerStream<T: Element> {
    upstream: Rc<dyn Node>,
    func: Box<dyn Fn() -> T>,
    #[new(default)]
    value: T,
}

impl<T: Element> MutableNode for ProducerStream<T> {
    fn cycle(&mut self, _state: &mut GraphState) -> anyhow::Result<bool> {
        self.value = (self.func)();
        Ok(true)
    }

    fn upstreams(&self) -> UpStreams {
        UpStreams::new(vec![self.upstream.clone()], vec![])
    }
}

impl<T: Element> StreamPeekRef<T> for ProducerStream<T> {
    fn peek_ref(&self) -> &T {
        &self.value
    }
}