code: func SymMerge(u, w Comparators) Comparators {
  	lenU, lenW := len(u), len(w)
  	if lenU == 0 {
  		return w
  	}
  
  	if lenW == 0 {
  		return u
  	}
  
  	diff := lenU - lenW
  	if math.Abs(float64(diff)) > 1 {
  		u1, w1, u2, w2 := prepareForSymMerge(u, w)
  
  		lenU1 := len(u1)
  		lenU2 := len(u2)
  		u = append(u1, w1...)
  		w = append(u2, w2...)
  		var wg sync.WaitGroup
  		wg.Add(2)
  		go func() {
  			symMerge(u, 0, lenU1, len(u))
  			wg.Done()
  		}()
  		go func() {
  			symMerge(w, 0, lenU2, len(w))
  			wg.Done()
  		}()
  
  		wg.Wait()
  		u = append(u, w...)
  		return u
  	}
  
  	u = append(u, w...)
  	symMerge(u, 0, lenU, len(u))
  	return u
  }
docs: // SymMerge will perform a symmetrical merge of the two provided
  // lists.  It is expected that these lists are pre-sorted.  Failure
  // to do so will result in undefined behavior.  This function does
  // make use of goroutines, so multithreading can aid merge time.
  // This makes M*log(N/M+1) comparisons where M is the length
  // of the shorter list and N is the length of the longer list.