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

/// @assertion abstract class SetMixin<K, V>
/// Mixin implementation of Set.
/// This class provides a base implementation of a Set that depends only on the
/// abstract members: [add], [contains], [lookup], [remove], [iterator], [length]
/// and [toSet].
/// @description Implementation of [add], [contains], [lookup], [remove],
/// [iterator], [length] and [toSet].
/// @author sgrekhov@unipro.ru

library set_mixin_lib;
import "dart:collection";

class SetMixinImpl<E> extends Object with SetMixin<E> {
  LinkedHashSet<E> _set;

  SetMixinImpl(): _set = new LinkedHashSet<E>();

  SetMixinImpl.from(Iterable content): _set =
      new LinkedHashSet<E>.from(content);

  bool add(E element) => _set.add(element);

  bool contains(Object? element) => _set.contains(element);

  E? lookup(Object? element) => _set.lookup(element);

  bool remove(Object? element) => _set.remove(element);

  Iterator<E> get iterator => _set.iterator;

  int get length => _set.length;

  Set<E> toSet() => _set.toSet();
}

Set create([Iterable? content]) {
  if (content == null) {
    return new SetMixinImpl();
  } else {
    return new SetMixinImpl.from(content);
  }
}
