code: func (b *Builder) AddGroup(info string, parent *BuilderGroup) *BuilderGroup {
  	parentIndex := 0
  	if parent != nil {
  		parentIndex = parent.index
  	}
  	index := len(b.ring.GroupToGroup)
  	b.ring.GroupToGroup = append(b.ring.GroupToGroup, parentIndex)
  	group := &BuilderGroup{builder: b, index: index, info: info}
  	b.groups = append(b.groups, group)
  	return group
  }
docs: // AddGroup adds another group to the builder. Info is a user-defined string
  // and is not used directly by the builder. The parent group offers a way to
  // tier groups; the builder will do its best to keep similar assignments in
  // dissimilar groups at each tier level. The parent may be nil. Cycles are not
  // allowed, where the parent of a group would end up being a child of the same
  // group.