code: func ParseSetName(elems []string, name string) (Set, error) {
  	if len(name) == 0 {
  		return zeroSet, nil
  	}
  
  	seps := strings.Split(name, ",")
  	marked := make(map[string]struct{}, len(seps))
  	for _, s := range seps {
  		marked[strings.ToLower(s)] = struct{}{}
  	}
  	items := make([]string, 0, len(seps))
  
  	value := uint64(0)
  	for i, n := range elems {
  		key := strings.ToLower(n)
  		if _, ok := marked[key]; ok {
  			value |= 1 << uint64(i)
  			delete(marked, key)
  			items = append(items, n)
  		}
  	}
  
  	if len(marked) == 0 {
  		return Set{Name: strings.Join(items, ","), Value: value}, nil
  	}
  
  	// name doesn't exist, maybe an integer?
  	if num, err := strconv.ParseUint(name, 0, 64); err == nil {
  		return ParseSetValue(elems, num)
  	}
  
  	return Set{}, errors.Errorf("item %s is not in Set %v", name, elems)
  }
docs: // ParseSetName creates a Set with name.