(
original_fn: F,
subpart: usize,
subpart_weights: &[f64],
)
| 469 | } |
| 470 | |
| 471 | pub(crate) fn split_progress<'b, F: Fn(usize, usize) -> Result<()> + 'b>( |
| 472 | original_fn: F, |
| 473 | subpart: usize, |
| 474 | subpart_weights: &[f64], |
| 475 | ) -> Box<dyn Fn(usize, usize) -> Result<()> + 'b> { |
| 476 | // Normalize weights |
| 477 | let weight_sum: f64 = subpart_weights.iter().sum(); |
| 478 | if weight_sum < 0.0001 { |
| 479 | return Box::new(|_, _| Ok(())); |
| 480 | } |
| 481 | |
| 482 | // Keep a running count of weights for the start |
| 483 | let mut subpart_starts = vec![]; |
| 484 | let mut start = 0f64; |
| 485 | for w in subpart_weights { |
| 486 | subpart_starts.push(start); |
| 487 | start += *w; |
| 488 | } |
| 489 | |
| 490 | let subpart_start = subpart_starts[subpart] / weight_sum; |
| 491 | let weight = subpart_weights[subpart] / weight_sum; |
| 492 | |
| 493 | Box::new(move |cur: usize, max: usize| { |
| 494 | // Just use a large number for easy divisibility |
| 495 | let steps = 1000000f64; |
| 496 | let subpart_size = steps * weight; |
| 497 | let subpart_progress = ((cur as f64) / (max as f64)) * subpart_size; |
| 498 | |
| 499 | original_fn( |
| 500 | (subpart_start * steps + subpart_progress) as usize, |
| 501 | steps as usize, |
| 502 | ) |
| 503 | }) |
| 504 | } |
| 505 | } |
no test coverage detected