code: func ClusterCombiners(combiners []Combiner, threshold float64) []Combiner {
  	if len(combiners) < 2 {
  		return combiners
  	}
  
  	s := &state{
  		Distances: initializeCombinerDistances(combiners, threshold),
  		DistanceFunc: func(a, b int) float64 {
  			return combiners[a].DistanceFromCombiner(combiners[b])
  		},
  	}
  
  	// successively merge
  	for i := 1; i < len(combiners); i++ {
  		lower, higher, dist := s.MinDistance()
  		if dist > threshold {
  			break
  		}
  
  		// merge these two
  		combiners[lower] = combiners[lower].Combine(combiners[higher])
  		s.ResetDistances(lower, higher)
  		combiners[higher] = nil
  	}
  
  	last := len(combiners) - 1
  	for i := range combiners {
  		if combiners[i] == nil {
  			combiners[i] = combiners[last]
  			last--
  		}
  	}
  
  	return combiners[:last+1]
  }
docs: // ClusterCombiners will do a simple hierarchical of the combiners.
  // It will modify the input slice as things will be combined into each other.