pub fn shortlex_b_tree_sets_length_range<I: Clone + Iterator>(
    a: u64,
    b: u64,
    xs: I
) -> ShortlexOrderedUniqueCollections<I, BTreeSet<I::Item>> 
where I::Item: Clone + Ord,
Expand description

Generates BTreeSets, with lengths in a range $[a, b)$, with elements from a single iterator.

The BTreeSets are generated in order of increasing length, and within each length they are ordered lexicographically with respect to the order of the element iterator.

The source iterator should not repeat any elements, but this is not enforced.

The iterator should be finite; if it is infinite, BTreeSets of length \max(2, a + 1) and above will never be generated.

If $a \leq b$, the output is empty.

If $a = 0$ and $b = 1$, the output consists of a single empty BTreeSet.

If the input iterator is infinite and $0 < a < b$, the output length is also infinite.

If the input iterator length is $n$, the output length is $$ \sum_{i=a}^b - 1 \binom{n}{i}. $$

§Examples

#[macro_use]
extern crate maplit;

use itertools::Itertools;
use malachite_base::sets::exhaustive::shortlex_b_tree_sets_length_range;

fn main() {
    let xss = shortlex_b_tree_sets_length_range(2, 4, 1..=4).collect_vec();
    assert_eq!(
        xss,
        &[
            btreeset!{1, 2},
            btreeset!{1, 3},
            btreeset!{1, 4},
            btreeset!{2, 3},
            btreeset!{2, 4},
            btreeset!{3, 4},
            btreeset!{1, 2, 3},
            btreeset!{1, 2, 4},
            btreeset!{1, 3, 4},
            btreeset!{2, 3, 4},
        ]
    );
}