pub fn random_b_tree_sets_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
) -> RandomBTreeSets<T, I, J>
Expand description

Generates random BTreeSets using elements from an iterator and with lengths from another iterator.

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). $$

lengths and xs must be infinite.

Examples

#[macro_use]
extern crate maplit;

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

fn main() {
    let xs = random_b_tree_sets_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,
        &[
            btreeset!{11, 85},
            btreeset!{134, 136, 200, 235},
            btreeset!{203, 223},
            btreeset!{38, 177, 217, 235},
            btreeset!{32, 162, 166, 234},
            btreeset!{30, 218},
            btreeset!{},
            btreeset!{90, 106},
            btreeset!{},
            btreeset!{9, 151, 204, 216},
            btreeset!{78, 97, 213, 253},
            btreeset!{39, 91},
            btreeset!{170, 175, 191, 232},
            btreeset!{2, 233},
            btreeset!{22, 35, 198, 217},
            btreeset!{17, 32, 114, 173},
            btreeset!{65, 114, 121, 222},
            btreeset!{},
            btreeset!{25, 144, 148, 173},
            btreeset!{}
        ]
    );
}