pub trait RowScheduler {
fn run<T: Send>(&self, items: &mut [T], compute: &(dyn Fn(&mut T) + Send + Sync));
}
pub struct Serial;
impl RowScheduler for Serial {
fn run<T: Send>(&self, items: &mut [T], compute: &(dyn Fn(&mut T) + Send + Sync)) {
items.iter_mut().for_each(compute);
}
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::vec::Vec;
#[test]
fn serial_touches_every_item_once() {
let mut items: Vec<u32> = (0..8).collect();
Serial.run(&mut items, &|v| *v *= 2);
assert_eq!(items, (0..8).map(|v| v * 2).collect::<Vec<_>>());
}
#[test]
fn serial_over_an_empty_set_is_a_no_op() {
let mut items: Vec<u32> = Vec::new();
Serial.run(&mut items, &|v| *v += 1);
assert!(items.is_empty());
}
}