// 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.

// @dart = 2.9

/// @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));
}
