// 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 MapMixin<K, V>
/// Mixin implementing a Map.
/// This mixin has a basic implementation of all but five of the members of Map.
/// A basic Map class can be implemented by mixin in 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_mixin_lib;
import "dart:collection";

class MapMixinImpl<K, V> extends Object with MapMixin<K, V> {
  LinkedHashMap<K, V> _map;

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

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