| 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 |
| } |