code: func Union(arrs ...interface{}) (reflect.Value, bool) {
  	// create a temporary map to hold the contents of the arrays
  	tempMap := make(map[interface{}]uint8)
  	var kind reflect.Kind
  	var kindHasBeenSet bool
  
  	// write the contents of the arrays as keys to the map. The map values don't matter
  	for _, arg := range arrs {
  		tempArr, ok := Distinct(arg)
  		if !ok {
  			return reflect.Value{}, ok
  		}
  
  		// check to be sure the type hasn't changed
  		if kindHasBeenSet && tempArr.Len() > 0 && tempArr.Index(0).Kind() != kind {
  			return reflect.Value{}, false
  		}
  		if tempArr.Len() > 0 {
  			kindHasBeenSet = true
  			kind = tempArr.Index(0).Kind()
  		}
  
  		c := tempArr.Len()
  		for idx := 0; idx < c; idx++ {
  			tempMap[tempArr.Index(idx).Interface()] = 0
  		}
  	}
  
  	// the map keys are now unique instances of all of the array contents
  	mapLen := len(tempMap)
  	out := reflect.MakeSlice(reflect.TypeOf(arrs[0]), mapLen, mapLen)
  	i := 0
  	for key := range tempMap {
  		v := reflect.ValueOf(key)
  		o := out.Index(i)
  		o.Set(v)
  		i++
  	}
  
  	return out, true
  }
docs: // Union returns a slice that contains the unique values of all the input slices
  //
  // [1, 2, 2, 4, 6] & [2, 4, 5] >> [1, 2, 4, 5, 6]
  //
  // [1, 1, 3, 4, 5, 6] >> [1, 3, 4, 5, 6]