graphix-package-rand 0.8.0

A dataflow language for UIs and network programming, rand package
Documentation
use anyhow::Result;
use graphix_package_core::run;
use netidx::subscriber::Value;

const RAND_FLOAT_DEFAULT: &str = r#"
  rand::rand(#clock:1)
"#;

run!(rand_float_default, RAND_FLOAT_DEFAULT, |v: Result<&Value>| {
    match v {
        Ok(Value::F64(f)) => *f >= 0.0 && *f < 1.0,
        _ => false,
    }
});

const RAND_FLOAT_RANGE: &str = r#"
  rand::rand(#start:10.0, #end:20.0, #clock:1)
"#;

run!(rand_float_range, RAND_FLOAT_RANGE, |v: Result<&Value>| {
    match v {
        Ok(Value::F64(f)) => *f >= 10.0 && *f < 20.0,
        _ => false,
    }
});

const RAND_INT_RANGE: &str = r#"
  rand::rand(#start:0, #end:100, #clock:1)
"#;

run!(rand_int_range, RAND_INT_RANGE, |v: Result<&Value>| {
    match v {
        Ok(Value::I64(i)) => *i >= 0 && *i < 100,
        _ => false,
    }
});

const PICK_FROM_ARRAY: &str = r#"
  rand::pick([10, 20, 30])
"#;

run!(pick_from_array, PICK_FROM_ARRAY, |v: Result<&Value>| {
    match v {
        Ok(Value::I64(i)) => *i == 10 || *i == 20 || *i == 30,
        _ => false,
    }
});

const PICK_SINGLE: &str = r#"
  rand::pick([42])
"#;

run!(pick_single, PICK_SINGLE, |v: Result<&Value>| {
    match v {
        Ok(Value::I64(42)) => true,
        _ => false,
    }
});

const SHUFFLE_ARRAY: &str = r#"
  rand::shuffle([1, 2, 3])
"#;

run!(shuffle_array, SHUFFLE_ARRAY, |v: Result<&Value>| {
    match v {
        Ok(Value::Array(a)) => {
            a.len() == 3
                && a.iter().any(|v| *v == Value::I64(1))
                && a.iter().any(|v| *v == Value::I64(2))
                && a.iter().any(|v| *v == Value::I64(3))
        }
        _ => false,
    }
});

const SHUFFLE_EMPTY: &str = r#"
  rand::shuffle([])
"#;

run!(shuffle_empty, SHUFFLE_EMPTY, |v: Result<&Value>| {
    match v {
        Ok(Value::Array(a)) => a.is_empty(),
        _ => false,
    }
});