use std::collections::HashMap; use std::collections::HashSet; use std::sync::{LazyLock, Mutex}; type OperatorCache = HashMap>>; static OPERATOR_SET_CACHE: LazyLock> = LazyLock::new(|| Mutex::new(HashMap::new())); fn check_operator_set_cache(cache_key: usize) -> Option>> { OPERATOR_SET_CACHE.lock().unwrap().get(&cache_key).cloned() } fn store_operator_set_in_cache(cache_key: usize, cache_value: HashSet>) { OPERATOR_SET_CACHE .lock() .unwrap() .insert(cache_key, cache_value); } fn create_operator_set_recurse( operators_permutation_set: &mut HashSet>, operators: Vec, ) { operators_permutation_set.insert(operators.clone()); if !operators.contains(&false) { return; } for i in 0..operators.len() { if operators[i] { continue; } let mut new_operators = operators.clone(); new_operators[i] = true; create_operator_set_recurse(operators_permutation_set, new_operators); } } pub fn create_operator_set(num_of_operators: usize) -> HashSet> { // Check cache if let Some(cached_value) = check_operator_set_cache(num_of_operators) { return cached_value.clone(); } let mut operator_sets: HashSet> = HashSet::new(); create_operator_set_recurse(&mut operator_sets, vec![false; num_of_operators]); // Store value in cache store_operator_set_in_cache(num_of_operators, operator_sets.clone()); operator_sets }