reductor

Generic abstractions for combining and nesting reduction patterns for iterables.

Docs: https//docs.rs/reductor

Before & After:

Before

```rust fn processsamples( samples: &[i32], scale: &[i32], upperlimit: i32 ) { let mut sum = 0; let mut min = None; let mut max = None;

for (sample, scale) in samples.iter().zip(scale) {
    let scaled = sample * scale;

    if scaled <= upper_limit {
        continue;
    }

    sum += scaled;
    min = Some(match min {
        Some(min) => scaled.min(min),
        None => scaled,
    });
    max = Some(match max {
        Some(max) => scaled.max(max),
        None => scaled,
    });
}

// ...

} ```

After

```rust use reductor::{Reduce, ReductorPair, Sum, Min, Max};

fn processsamples( samples: &[i32], scale: &[i32], upperlimit: i32 ) { let ReductorPair( Sum::(sum), ReductorPair( Min::>(min), Max::>(max), ), ) = samples .iter() .zip(scale) .map(|(sample, scale)| sample * scale) .filter(|&scaled| scaled <= upperlimit) .reducewith();

// ...

} ```