#iterator-extension #values #max #traits #getting

max_values

Struct and iterator extension trait for getting max values out of given

1 stable release

1.0.0 Mar 9, 2023

#1668 in Rust patterns

MIT license

11KB
128 lines

MaxValues

Package, that allows you to effectively get max values out of any sequence

For full documentation, see this

Basic usage

The basic usage of this package looks like this

use max_values::MaxValues;

fn main() {
    let mut values = MaxValues::<i32, 3>::new();
    values.push(2);
    assert_eq!(values.as_ref(), [2]);

    values.push(3);
    values.push(4);
    assert_eq!(values.iter().copied().collect::<HashSet<_>>(), HashSet::from([2, 3, 4]));

    values.push(1);
    assert_eq!(values.iter().copied().collect::<HashSet<_>>(), HashSet::from([2, 3, 4]));

    values.push(5);
    assert_eq!(values.iter().copied().collect::<HashSet<_>>(), HashSet::from([3, 4, 5]));

    values.push(4);
    assert_eq!(values.iter().copied().collect::<HashSet<_>>(), HashSet::from([4, 4, 5]));
}

Beware, that MaxValues struct doesn't guarantee any order of elements. That's why we're transforming it into hashset for assert_eq macro.

Using iterator adaptor

Common pattern is to iterate through collection and push it elements to MaxValues like this:

use max_values::MaxValues;

fn main() {
    let arr = [0, 1, 5, 7, 2, 3];

    let values = MaxValues::<i32, 3>::new();
    for i in arr {
        values.push(i);
    }

    assert_eq!(values.into_iter().collect::<HashSet<_>>, HashSet::from([3, 5, 7]));
}

That's why MaxValues implements FromIterable<T>:

let arr = [0, 1, 5, 7, 2, 3];
let values = MaxValues::<i32, 3>::from_iter(arr.into_iter());
assert_eq!(values.into_iter().collect::<HashSet<_>>(), HashSet::from([3, 5, 7]));

Also, you can use iterator extension trait MaxValuesIterExt to iterate over max values of iterator:

use max_values::MaxValuesIterExt;

fn main() {
    let values = [1, 5, 2, 4, 7, 10, 0, 15, 3];
    assert_eq!(
        values.into_iter().max_values::<3>().collect::<HashSet<_>>(),
        HashSet::from([7, 10, 15])
    );
}

Dependencies

~66KB