use std::sync::Mutex; fn par_for(iter: I, f: F) where I: Iterator, I::Item: Send, F: Fn(I::Item) + Sync, { for item in iter { f(item) } } fn sum(x: &[i32]) { let sum_lengths = Mutex::new(0); par_for(x.windows(4), |x| *sum_lengths.lock().unwrap() += x.len()); assert_eq!(*sum_lengths.lock().unwrap(), (x.len() - 3) * 4); } fn main() { let mut elements = [0; 20]; // iterators over references into this stack frame par_for(elements.iter_mut().enumerate(), |(i, x)| *x = i as i32); sum(&elements) }