// Copyright (c) 2012, 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.

patch class Expando<T> {
  /* patch */ Expando([this.name]) : _data = new List();

  /* patch */ T operator[](Object object) {
    _checkType(object);
    var doCompact = false;
    var result = null;
    for (int i = 0; i < _data.length; ++i) {
      var key = _data[i].key;
      if (identical(key, object)) {
        result = _data[i].value;
        break;
      }
      if (key == null) {
        doCompact = true;
        _data[i] = null;
      }
    }
    if (doCompact) {
      _data = _data.where((e) => (e != null)).toList();
    }
    return result;
  }

  /* patch */ void operator[]=(Object object, T value) {
    _checkType(object);
    var doCompact = false;
    int i = 0;
    for (; i < _data.length; ++i) {
      var key = _data[i].key;
      if (identical(key, object)) {
        break;
      }
      if (key == null) {
        doCompact = true;
        _data[i] = null;
      }
    }
    if (i != _data.length && value == null) {
      doCompact = true;
      _data[i] = null;
    } else if (i != _data.length) {
      _data[i].value = value;
    } else {
      _data.add(new _WeakProperty(object, value));
    }
    if (doCompact) {
      _data = _data.where((e) => (e != null)).toList();
    }
  }

  static _checkType(object) {
    if (object == null || object is bool || object is num || object is String) {
      throw new ArgumentError(object);
    }
  }

  List _data;
}
