pub fn random_ordered_unique_vecs_from_length_iterator<T: Ord, I: Iterator<Item = u64>, J: Iterator<Item = T>>(
    seed: Seed,
    lengths_gen: &dyn Fn(Seed) -> I,
    xs_gen: &dyn Fn(Seed) -> J
) -> RandomOrderedUniqueVecs<T, I, J>Notable traits for RandomOrderedUniqueVecs<T, I, J>impl<T: Ord, I: Iterator<Item = u64>, J: Iterator<Item = T>> Iterator for RandomOrderedUniqueVecs<T, I, J> type Item = Vec<T>;
Expand description

Generates random Vecs using elements from an iterator and with lengths from another iterator, where the Vecs have no repeated elements, and the elements are in ascending order.

The input iterator must generate at least many distinct elements as any number generated by the lengths iterator; otherwise, this iterator will hang.

$$ P((x_i)_{i=0}^{n-1}) = n!P(n)\prod_{i=0}^{n-1}P(x_i). $$

The above formula assumes that the Vec is valid, \emph{i.e.} its elements are strictly increasing. The probability of an invalid Vec is zero.

lengths and xs must be infinite.

Examples

extern crate itertools;

use itertools::Itertools;
use malachite_base::num::random::random_primitive_ints;
use malachite_base::random::EXAMPLE_SEED;
use malachite_base::vecs::random::random_ordered_unique_vecs_from_length_iterator;
use malachite_base::vecs::random_values_from_vec;

let xs = random_ordered_unique_vecs_from_length_iterator(
    EXAMPLE_SEED,
    &|seed| random_values_from_vec(seed, vec![0, 2, 4]),
    &random_primitive_ints::<u8>,
);
let values = xs.take(20).collect_vec();
assert_eq!(
    values.iter().map(Vec::as_slice).collect_vec().as_slice(),
    &[
        &[11, 85][..],
        &[134, 136, 200, 235],
        &[203, 223],
        &[38, 177, 217, 235],
        &[32, 162, 166, 234],
        &[30, 218],
        &[],
        &[90, 106],
        &[],
        &[9, 151, 204, 216],
        &[78, 97, 213, 253],
        &[39, 91],
        &[170, 175, 191, 232],
        &[2, 233],
        &[22, 35, 198, 217],
        &[17, 32, 114, 173],
        &[65, 114, 121, 222],
        &[],
        &[25, 144, 148, 173],
        &[]
    ]
);