1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

//! Various subsets of slice's items that are able to iterate forward and backward over references to selected items.

// TODO: use bitvec

// TODO: add compiletest
// Example:
//   let mut set = vec![9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
//   let idxs = vec![2, 4, 7];
//   let mut subset = SubsetMut::new(&mut set, &idxs).unwrap();
//   let mut iter = subset.iter_mut();
//   let r2 = iter.next().unwrap();
//   subset.set()[0] = 100;   // MUST NOT COMPILE: Cannot borrow as mutable more than once at a time
//   *r2 = 19;


use std::collections::HashSet;

/// Subset construction or conversion error.
#[derive(Debug,PartialEq,Eq)]
pub enum SubsetError {
    NotUnique,
    OutOfBounds
}

fn is_unique(array: &[usize]) -> bool {
    let mut uniques: HashSet<usize> = HashSet::with_capacity(array.len());
    array.iter().all(|idx| uniques.insert(*idx))
}


pub mod unique;
pub mod multi;