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

// @dart = 2.9

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