| Index: mojo/public/dart/third_party/html/lib/src/list_proxy.dart
|
| diff --git a/mojo/public/dart/third_party/html/lib/src/list_proxy.dart b/mojo/public/dart/third_party/html/lib/src/list_proxy.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..99acdb6733387d18b85f22922d28a9c9e0519511
|
| --- /dev/null
|
| +++ b/mojo/public/dart/third_party/html/lib/src/list_proxy.dart
|
| @@ -0,0 +1,105 @@
|
| +// TODO(jmesserly): remove this once we have a subclassable growable list
|
| +// in our libraries.
|
| +
|
| +/// A [List] proxy that you can subclass.
|
| +library list_proxy;
|
| +
|
| +import 'dart:collection';
|
| +import 'dart:math' show Random;
|
| +
|
| +// TOOD(jmesserly): this needs to be removed, but fixing NodeList is tricky.
|
| +class ListProxy<E> extends IterableBase<E> implements List<E> {
|
| +
|
| + /// The inner [List<T>] with the actual storage.
|
| + final List<E> _list;
|
| +
|
| + /// Creates a list proxy.
|
| + /// You can optionally specify the list to use for [storage] of the items,
|
| + /// otherwise this will create a [List<E>].
|
| + ListProxy([List<E> storage]) : _list = storage != null ? storage : <E>[];
|
| +
|
| + // TODO(jmesserly): This should be on List.
|
| + // See http://code.google.com/p/dart/issues/detail?id=947
|
| + bool remove(E item) {
|
| + int i = indexOf(item);
|
| + if (i == -1) return false;
|
| + removeAt(i);
|
| + return true;
|
| + }
|
| +
|
| + void insert(int index, E item) => _list.insert(index, item);
|
| +
|
| + // Override from Iterable to fix performance
|
| + // Length and last become O(1) instead of O(N)
|
| + // The others are just different constant factor.
|
| + int get length => _list.length;
|
| + E get last => _list.last;
|
| + E get first => _list.first;
|
| + E get single => _list.single;
|
| +
|
| + // From Iterable
|
| + Iterator<E> get iterator => _list.iterator;
|
| +
|
| + // From List
|
| + E operator [](int index) => _list[index];
|
| + operator []=(int index, E value) {
|
| + _list[index] = value;
|
| + }
|
| + set length(int value) {
|
| + _list.length = value;
|
| + }
|
| + void add(E value) {
|
| + _list.add(value);
|
| + }
|
| +
|
| + void addLast(E value) {
|
| + add(value);
|
| + }
|
| + void addAll(Iterable<E> collection) {
|
| + _list.addAll(collection);
|
| + }
|
| + void sort([int compare(E a, E b)]) {
|
| + _list.sort(compare);
|
| + }
|
| + void shuffle([Random random]) {
|
| + _list.shuffle(random);
|
| + }
|
| +
|
| + int indexOf(E element, [int start = 0]) => _list.indexOf(element, start);
|
| + int lastIndexOf(E element, [int start]) => _list.lastIndexOf(element, start);
|
| + void clear() {
|
| + _list.clear();
|
| + }
|
| +
|
| + E removeAt(int index) => _list.removeAt(index);
|
| + E removeLast() => _list.removeLast();
|
| +
|
| + void removeWhere(bool test(E element)) => _list.removeWhere(test);
|
| + void retainWhere(bool test(E element)) => _list.retainWhere(test);
|
| +
|
| + List<E> sublist(int start, [int end]) => _list.sublist(start, end);
|
| +
|
| + List<E> getRange(int start, int end) => _list.getRange(start, end);
|
| +
|
| + void setRange(int start, int length, List<E> from, [int startFrom = 0]) {
|
| + _list.setRange(start, length, from, startFrom);
|
| + }
|
| + void removeRange(int start, int length) {
|
| + _list.removeRange(start, length);
|
| + }
|
| + void insertAll(int index, Iterable<E> iterable) {
|
| + _list.insertAll(index, iterable);
|
| + }
|
| +
|
| + Iterable<E> get reversed => _list.reversed;
|
| +
|
| + Map<int, E> asMap() => _list.asMap();
|
| +
|
| + void replaceRange(int start, int end, Iterable<E> newContents) =>
|
| + _list.replaceRange(start, end, newContents);
|
| +
|
| + void setAll(int index, Iterable<E> iterable) => _list.setAll(index, iterable);
|
| +
|
| + void fillRange(int start, int end, [E fillValue]) =>
|
| + _list.fillRange(start, end, fillValue);
|
| +}
|
|
|