package experiments // Set is a collection of experiments where every experiment is either a member // or not. type Set map[Experiment]struct{} // NewSet constructs a new Set with the given experiments as its initial members. func NewSet(exps ...Experiment) Set { ret := make(Set) for _, exp := range exps { ret.Add(exp) } return ret } // SetUnion constructs a new Set containing the members of all of the given // sets. func SetUnion(sets ...Set) Set { ret := make(Set) for _, set := range sets { for exp := range set { ret.Add(exp) } } return ret } // Add inserts the given experiment into the set. // // If the given experiment is already present then this is a no-op. func (s Set) Add(exp Experiment) { s[exp] = struct{}{} } // Remove takes the given experiment out of the set. // // If the given experiment not already present then this is a no-op. func (s Set) Remove(exp Experiment) { delete(s, exp) } // Has tests whether the given experiment is in the receiving set. func (s Set) Has(exp Experiment) bool { _, ok := s[exp] return ok }