// Copyright (c) 2016, 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.

import 'dart:collection';

import 'unmodifiable_wrappers.dart';
import 'wrappers.dart';

/// An unmodifiable, empty set which can be constant.
class EmptyUnmodifiableSet<E> extends IterableBase<E>
    with UnmodifiableSetMixin<E>
    implements UnmodifiableSetView<E> {
  const EmptyUnmodifiableSet();

  @override
  Iterator<E> get iterator => Iterable<E>.empty().iterator;
  @override
  int get length => 0;
  @override
  EmptyUnmodifiableSet<T> cast<T>() => EmptyUnmodifiableSet<T>();
  @override
  bool contains(Object? element) => false;
  @override
  bool containsAll(Iterable<Object?> other) => other.isEmpty;
  @override
  Iterable<E> followedBy(Iterable<E> other) => DelegatingIterable(other);
  @override
  E? lookup(Object? element) => null;
  @Deprecated('Use cast instead')
  @override
  EmptyUnmodifiableSet<T> retype<T>() => EmptyUnmodifiableSet<T>();
  @override
  E singleWhere(bool Function(E) test, {E Function()? orElse}) =>
      orElse != null ? orElse() : throw StateError('No element');
  @override
  Iterable<T> whereType<T>() => Iterable<T>.empty();
  @override
  Set<E> toSet() => {};
  @override
  Set<E> union(Set<E> other) => Set.of(other);
  @override
  Set<E> intersection(Set<Object?> other) => {};
  @override
  Set<E> difference(Set<Object?> other) => {};
}
