futuresdr 0.0.39

An Experimental Async SDR Runtime for Heterogeneous Architectures.
Documentation
use anyhow::Result;
use futuresdr::blocks::Apply;
use futuresdr::blocks::VectorSink;
use futuresdr::blocks::VectorSource;
use futuresdr::prelude::*;

#[test]
fn apply_const_fn() -> Result<()> {
    let mut fg = Flowgraph::new();

    let orig: Vec<f32> = vec![1.0, 2.0, 3.5, 4.5, 10.5];
    let src = VectorSource::<f32>::new(orig.clone());
    let apply: Apply<_, _, _> = Apply::new(|i: &f32| -> f32 { *i + 4.0 });
    let snk = VectorSink::<f32>::new(orig.len());

    connect!(fg, src > apply > snk);

    Runtime::new().run(fg)?;

    let snk = snk.get()?;
    let v = snk.items();

    assert_eq!(v.len(), orig.len());
    for (v_before, v_after) in orig.iter().zip(v) {
        assert!((v_after - v_before - 4.0).abs() < f32::EPSILON);
    }

    Ok(())
}

#[test]
fn apply_mut_fn() -> Result<()> {
    let mut fg = Flowgraph::new();

    let mut v = 0;
    let orig: Vec<u8> = vec![1, 2, 3, 4, 10];
    let src = VectorSource::<u8>::new(orig.clone());
    let add: Apply<_, _, _> = Apply::new(move |i: &u8| -> u8 {
        let ret = *i + v + 4;
        v += 1;
        ret
    });
    let snk = VectorSink::<u8>::new(orig.len());

    connect!(fg, src > add > snk);

    Runtime::new().run(fg)?;

    let snk = snk.get()?;
    let v = snk.items();

    assert_eq!(v.len(), orig.len());
    for (i, (v_before, v_after)) in orig.iter().zip(v).enumerate() {
        assert_eq!(*v_before + 4 + i as u8, *v_after);
    }

    Ok(())
}