oxilean_std/hashset/
oxihashset_new_group.rs1use std::collections::HashSet as StdHashSet;
8use std::hash::Hash;
9
10use super::oxihashset_type::OxiHashSet;
11
12impl<T: Eq + Hash + Clone> OxiHashSet<T> {
13 pub fn new() -> Self {
15 Self {
16 inner: StdHashSet::new(),
17 }
18 }
19 pub fn singleton(elem: T) -> Self {
21 let mut s = Self::new();
22 s.insert(elem);
23 s
24 }
25 pub fn flat_map<U, F>(&self, f: F) -> OxiHashSet<U>
27 where
28 U: Eq + Hash + Clone,
29 F: Fn(&T) -> OxiHashSet<U>,
30 {
31 let mut result = OxiHashSet::new();
32 for elem in &self.inner {
33 result = result.union(&f(elem));
34 }
35 result
36 }
37 pub fn power_set(&self) -> Vec<Self> {
39 let elems: Vec<T> = self.inner.iter().cloned().collect();
40 let n = elems.len();
41 (0usize..(1 << n))
42 .map(|mask| {
43 let mut s = Self::new();
44 for (i, e) in elems.iter().enumerate() {
45 if mask & (1 << i) != 0 {
46 s.insert(e.clone());
47 }
48 }
49 s
50 })
51 .collect()
52 }
53}