/*
 * Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * @assertion Notice that an explicit override introduces a type context for the
 * object. Example:
 *
 *   extension SymDiff<T> on Set<T> {
 *     Set<T> symmetricDifference(Set<T> other) =>
 *       this.difference(other).union(other.difference(this))
 *   }
 *   ...
 *   SymDiff({}).symmetricDifference(someSet);
 *
 *   Here the inference used to infer type parameters will also affect the
 *   extension receiver "parameter", and make {} a set literal.
 * @description Check that {} is a set literal in the example above.
 * @author iarkh@unipro.ru
 */


import "../../Utils/expect.dart";

extension SymDiff<T> on Set<T> {
  Set<T> symmetricDifference(Set<T> other) =>
    this.difference(other).union(other.difference(this));
}

main() {
  Set someSet = {2};
  Expect.setEquals(someSet, SymDiff({}).symmetricDifference(someSet));
}
