code: func (m FloatMapper) ID(fi ...interface{}) (rowIDs []int64, err error) {
  	f := fi[0].(float64)
  	externalID := int64(len(m.Buckets))
  	if f < m.Buckets[0] || f > m.Buckets[len(m.Buckets)-1] {
  		if m.allowExternal {
  			return []int64{externalID}, nil
  		}
  		return []int64{0}, fmt.Errorf("float %v out of range", f)
  	}
  	// TODO: make clear decision about which way the equality goes, and document it
  	// TODO: use binary search if there are a lot of buckets
  	for i, v := range m.Buckets {
  		if f < v {
  			return []int64{int64(i)}, nil
  		}
  	}
  
  	// this should be unreachable (TODO test)
  	return []int64{0}, nil
  }
docs: // ID maps floats to arbitrary buckets