code: func (c *threadSafeMap) Index(indexName string, obj interface{}) ([]interface{}, error) {
  	c.lock.RLock()
  	defer c.lock.RUnlock()
  
  	indexFunc := c.indexers[indexName]
  	if indexFunc == nil {
  		return nil, fmt.Errorf("Index with name %s does not exist", indexName)
  	}
  
  	indexKeys, err := indexFunc(obj)
  	if err != nil {
  		return nil, err
  	}
  	index := c.indices[indexName]
  
  	// need to de-dupe the return list.  Since multiple keys are allowed, this can happen.
  	returnKeySet := sets.String{}
  	for _, indexKey := range indexKeys {
  		set := index[indexKey]
  		for _, key := range set.List() {
  			returnKeySet.Insert(key)
  		}
  	}
  
  	list := make([]interface{}, 0, returnKeySet.Len())
  	for absoluteKey := range returnKeySet {
  		list = append(list, c.items[absoluteKey])
  	}
  	return list, nil
  }
docs: // Index returns a list of items that match on the index function
  // Index is thread-safe so long as you treat all items as immutable