// 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 SetBase<E>
/// Base 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_base_lib;
import "dart:collection";

class SetBaseImpl<E> extends SetBase<E> {
  LinkedHashSet<E> _set;

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

  SetBaseImpl.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();
}

SetBase create([Iterable content]) {
  if (content == null) {
    return new SetBaseImpl();
  } else {
    return new SetBaseImpl.from(content);
  }
}
