Skip to main content

oxilean_std/hashset/
oxihashset_new_group.rs

1//! # OxiHashSet - new_group Methods
2//!
3//! This module contains method implementations for `OxiHashSet`.
4//!
5//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
6
7use std::collections::HashSet as StdHashSet;
8use std::hash::Hash;
9
10use super::oxihashset_type::OxiHashSet;
11
12impl<T: Eq + Hash + Clone> OxiHashSet<T> {
13    /// Create an empty set.
14    pub fn new() -> Self {
15        Self {
16            inner: StdHashSet::new(),
17        }
18    }
19    /// Create a singleton set containing exactly one element.
20    pub fn singleton(elem: T) -> Self {
21        let mut s = Self::new();
22        s.insert(elem);
23        s
24    }
25    /// Flat-map: apply `f` to each element and union all results.
26    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    /// Return the power set (set of all subsets) — only feasible for small sets.
38    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}