use derive_new::new;
use std::rc::Rc;
use crate::types::*;
#[derive(new)]
pub struct WithTimeStream<T: Element> {
upstream: Rc<dyn Stream<T>>,
#[new(default)]
value: (NanoTime, T),
}
#[node(active = [upstream], output = value: (NanoTime, T))]
impl<T: Element> MutableNode for WithTimeStream<T> {
fn cycle(&mut self, state: &mut GraphState) -> anyhow::Result<bool> {
self.value = (state.time(), self.upstream.peek_value());
Ok(true)
}
}
#[cfg(test)]
mod tests {
use crate::graph::*;
use crate::nodes::*;
#[test]
fn timestamps_match_graph_time() {
let out = ticker(Duration::from_nanos(100))
.count()
.with_time()
.collect();
out.run(RunMode::HistoricalFrom(NanoTime::ZERO), RunFor::Cycles(4))
.unwrap();
let items = out.peek_value();
assert_eq!(items.len(), 4);
for item in &items {
let (t, _v) = item.value;
assert_eq!(t, item.time);
}
assert_eq!(items[0].value, (NanoTime::new(0), 1u64));
assert_eq!(items[3].value, (NanoTime::new(300), 4u64));
}
}