#[allow(unused_imports)]
use rhai::plugin::*;
#[export_module]
pub mod array_functions {
use rand::prelude::*;
use rhai::{Array, Dynamic, INT};
#[rhai_fn(global)]
pub fn sample(array: &mut Array) -> Dynamic {
if !array.is_empty() {
let mut rng = rand::thread_rng();
if let Some(res) = array.choose(&mut rng) {
return res.clone();
}
}
Dynamic::UNIT
}
#[rhai_fn(global, name = "sample")]
pub fn sample_with_amount(array: &mut Array, amount: INT) -> Array {
if array.is_empty() || amount <= 0 {
return Array::new();
}
let mut rng = rand::thread_rng();
let amount = amount as usize;
if amount >= array.len() {
let mut res = array.clone();
res.shuffle(&mut rng);
res
} else {
let mut res: Array = array.choose_multiple(&mut rng, amount).cloned().collect();
res.shuffle(&mut rng);
res
}
}
#[rhai_fn(global)]
pub fn shuffle(array: &mut Array) {
let mut rng = rand::thread_rng();
array.shuffle(&mut rng);
}
}