// 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 MapBase<K, V>
/// Base class for implementing a Map.
/// This class has a basic implementation of all but five of the members of Map.
/// A basic Map class can be implemented by extending this class and implementing
/// keys, operator[], operator[]=, remove and clear. The remaining operations are
/// implemented in terms of these five.
/// @description Implementation of keys, operator[], operator[]=, remove and
/// clear
/// @author sgrekhov@unipro.ru

library map_base_lib;
import "dart:collection";

class MapBaseImpl<K, V> extends MapBase<K, V> {
  LinkedHashMap<K, V> _map;

  MapBaseImpl(): _map = new LinkedHashMap<K, V>();

  MapBaseImpl.from(Map content): _map = new LinkedHashMap<K, V>.from(content);

  Iterable<K> get keys => _map.keys;
  
  V? operator [](Object? key) => _map[key];

  void operator []=(K key, V value) {
    _map[key] = value;
  }

  void clear() {
    _map.clear();
  }

  V? remove(Object? key) => _map.remove(key);
}

