importunate

github crates.io docs.rs build status

Apply and manipulate permutations of small, const sized, distinct sets.

no_std by default. Features for serde and arbitrary

The name of the crate is an anagram of 'permutation'.


This crate works with Cargo with a Cargo.toml like:

toml [dependencies] importunate = "0.1.0"

Getting started

```rust use importunate::*;

fn main() { let arr1 = [2,0,1,3]; let mut arr2 = ["zero", "one", "two", "three"]; let perm = Permutation::::calculate_unchecked(&arr1, |&x|x); perm.apply(arr2);

assert_eq!(arr2,["two","zero", "one",  "three"] );

} ```

Permutations take two generic parameters, the Inner type (an unsigned integer) and the number of Elements.

The number of elements must not be greater than the maximum allowed for that inner type. The following table shows how many elements can fit into each type as well as the minimum number of bytes needed.

|Max Elements|Bytes|Type | |:----------:|:---:|:----:| | 5 | 1 | u8 | | 8 | 2 |u16 | | 10 | 3 |u32 | | 12 | 4 | | | 14 | 5 |u64 | | 16 | 6 | | | 18 | 7 | | | 20 | 8 | | | 22 | 9 |u128| | 24 | 10 | | | 25 | 11 | | | 27 | 12 | | | 29 | 13 | | | 30 | 14 | | | 32 | 15 | | | 34 | 16 | |

There are three different methods for calculating a permutation:

calculate_incomplete will calculate the permuation for any array whose elements implement Ord but it is comparatively slow. It will even work if the array contains duplicate elements but keep in mind that permuations describing such arrays will not be unique.

try_calculate and calculate_unchecked both expect arrays of elements and functions mapping those elements to u8. Every element should map to a different u8 in the range 0..ELEMENTS. If this condition is not met, try_calculate will return None and calculate_unchecked will panic or loop forever. Do not use it on user input

Contributing

Contributions are welcome! Open a pull request to fix a bug, or open an issue to discuss a new feature or change.

Check out the Contributing section in the docs for more info.

License

This project is proudly licensed under the MIT license (LICENSE or http://opensource.org/licenses/MIT).

importunate can be distributed according to the MIT license. Contributions will be accepted under the same license.

Authors