use rand::{RngCore, SeedableRng};
use rand_xoshiro::Xoshiro256Plus;
use tracing::{Level, event};
use crate::IdTargeted;
use crate::ThreadShutdownResponse;
use crate::pool_item;
#[derive(Debug, PartialEq, Eq)]
pub struct Randoms {
pub id: u64,
pub numbers: Vec<u64>,
}
impl IdTargeted for Randoms {
fn id(&self) -> u64 {
self.id
}
}
#[pool_item(Shutdown = "shutdown_pool_impl")]
impl Randoms {
pub fn new(id: u64) -> Self {
let mut rng = Xoshiro256Plus::seed_from_u64(id);
let numbers = (0..10000).map(|_| rng.next_u64()).collect();
Self { id, numbers }
}
pub fn shutdown_pool_impl(&self) -> Vec<ThreadShutdownResponse> {
vec![ThreadShutdownResponse::new(self.id, vec![])]
}
#[messaging(MeanRequest, MeanResponse)]
pub fn mean(&self) -> u128 {
event!(Level::DEBUG, "evaluating mean");
self.numbers.iter().map(|n| *n as u128).sum::<u128>() / self.numbers.len() as u128
}
#[unsafe(no_mangle)]
#[messaging(SumRequest, SumResponse)]
pub fn sum(&self) -> u128 {
event!(Level::DEBUG, "evaluating sum");
for i in 0..=50 {
let r = self.numbers.iter().map(|n| *n as u128).sum::<u128>();
if i == 50 {
return r;
}
}
0
}
#[messaging(PanicRequest, PanicResponse)]
pub fn panic_call(&self) {
panic!("request to panic received")
}
}
pub use RandomsInit as RandomsAddRequest;
impl MeanResponse {
pub fn mean(&self) -> u128 {
self.result
}
}
impl SumResponse {
pub fn sum(&self) -> u128 {
self.result
}
}