code: func setElementCompareValues(schema *configschema.Block, set cty.Value, isConfig bool) [][2]cty.Value {
  	ret := make([][2]cty.Value, 0, set.LengthInt())
  	for it := set.ElementIterator(); it.Next(); {
  		_, ev := it.Element()
  		ret = append(ret, [2]cty.Value{ev, setElementCompareValue(schema, ev, isConfig)})
  	}
  	return ret
  }
docs: // setElementCompareValues takes a known, non-null value of a cty.Set type and
  // returns a table -- constructed of two-element arrays -- that maps original
  // set element values to corresponding values that have all of the computed
  // values removed, making them suitable for comparison with values obtained
  // from configuration. The element type of the set must conform to the implied
  // type of the given schema, or this function will panic.
  //
  // In the resulting slice, the zeroth element of each array is the original
  // value and the one-indexed element is the corresponding "compare value".
  //
  // This is intended to help correlate prior elements with configured elements
  // in ProposedNewObject. The result is a heuristic rather than an exact science,
  // since e.g. two separate elements may reduce to the same value through this
  // process. The caller must therefore be ready to deal with duplicates.