use gmt_dos_actors::actorscript;
use gmt_dos_clients::{
    average::Average,
    print::Print,
    sampler::Sampler,
    signals::{Signal, Signals},
};
use interface::UID;

#[derive(UID)]
enum U {}

#[derive(UID)]
enum A {}

#[derive(UID)]
enum D {}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let n_step = 10;
    let unit = Signals::new(1, n_step).channel(0, Signal::Ramp { a: 1., b: 0. });
    let print = Print::new(3);
    let average = Average::new(1);
    let decimator = Sampler::default();

    actorscript!(
        1: unit[U] -> print
        1: unit[U] -> average
        3: average[A]! -> print
        1: unit[U] -> decimator
        3: decimator[D] -> print
    );

    Ok(())
}
