pub fn sklansky_prefix<T: Clone>(items: &[T], mut combine: impl FnMut(&T, &T) -> T) -> Vec<T> {
let mut prefixes = items.to_vec();
let mut half = 1;
while half < prefixes.len() {
for block_start in (0..prefixes.len()).step_by(2 * half) {
let left_last = block_start + half - 1;
let block_end = (block_start + 2 * half).min(prefixes.len());
for index in left_last + 1..block_end {
prefixes[index] = combine(&prefixes[left_last], &prefixes[index]);
}
}
half *= 2;
}
prefixes
}
pub fn brent_kung_prefix<T: Clone>(items: &[T], mut combine: impl FnMut(&T, &T) -> T) -> Vec<T> {
let mut prefixes = items.to_vec();
let mut span = 1;
while span < prefixes.len() {
for index in (2 * span - 1..prefixes.len()).step_by(2 * span) {
prefixes[index] = combine(&prefixes[index - span], &prefixes[index]);
}
span *= 2;
}
span /= 2;
while span >= 1 {
for index in (3 * span - 1..prefixes.len()).step_by(2 * span) {
prefixes[index] = combine(&prefixes[index - span], &prefixes[index]);
}
span /= 2;
}
prefixes
}