Index: pkg/dev_compiler/tool/input_sdk/lib/internal/iterable.dart |
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/internal/iterable.dart b/pkg/dev_compiler/tool/input_sdk/lib/internal/iterable.dart |
deleted file mode 100644 |
index 4d404ebb0186b60405ab589dc1be93f458573130..0000000000000000000000000000000000000000 |
--- a/pkg/dev_compiler/tool/input_sdk/lib/internal/iterable.dart |
+++ /dev/null |
@@ -1,766 +0,0 @@ |
-// Copyright (c) 2011, 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. |
- |
-part of dart._internal; |
- |
-/** |
- * Marker interface for [Iterable] subclasses that have an efficient |
- * [length] implementation. |
- */ |
-abstract class EfficientLength { |
- /** |
- * Returns the number of elements in the iterable. |
- * |
- * This is an efficient operation that doesn't require iterating through |
- * the elements. |
- */ |
- int get length; |
-} |
- |
-/** |
- * An [Iterable] for classes that have efficient [length] and [elementAt]. |
- * |
- * All other methods are implemented in terms of [length] and [elementAt], |
- * including [iterator]. |
- */ |
-abstract class ListIterable<E> extends Iterable<E> |
- implements EfficientLength { |
- int get length; |
- E elementAt(int i); |
- |
- const ListIterable(); |
- |
- Iterator<E> get iterator => new ListIterator<E>(this); |
- |
- void forEach(void action(E element)) { |
- int length = this.length; |
- for (int i = 0; i < length; i++) { |
- action(elementAt(i)); |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- } |
- |
- bool get isEmpty => length == 0; |
- |
- E get first { |
- if (length == 0) throw IterableElementError.noElement(); |
- return elementAt(0); |
- } |
- |
- E get last { |
- if (length == 0) throw IterableElementError.noElement(); |
- return elementAt(length - 1); |
- } |
- |
- E get single { |
- if (length == 0) throw IterableElementError.noElement(); |
- if (length > 1) throw IterableElementError.tooMany(); |
- return elementAt(0); |
- } |
- |
- bool contains(Object element) { |
- int length = this.length; |
- for (int i = 0; i < length; i++) { |
- if (elementAt(i) == element) return true; |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- return false; |
- } |
- |
- bool every(bool test(E element)) { |
- int length = this.length; |
- for (int i = 0; i < length; i++) { |
- if (!test(elementAt(i))) return false; |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- return true; |
- } |
- |
- bool any(bool test(E element)) { |
- int length = this.length; |
- for (int i = 0; i < length; i++) { |
- if (test(elementAt(i))) return true; |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- return false; |
- } |
- |
- E firstWhere(bool test(E element), { E orElse() }) { |
- int length = this.length; |
- for (int i = 0; i < length; i++) { |
- E element = elementAt(i); |
- if (test(element)) return element; |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- if (orElse != null) return orElse(); |
- throw IterableElementError.noElement(); |
- } |
- |
- E lastWhere(bool test(E element), { E orElse() }) { |
- int length = this.length; |
- for (int i = length - 1; i >= 0; i--) { |
- E element = elementAt(i); |
- if (test(element)) return element; |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- if (orElse != null) return orElse(); |
- throw IterableElementError.noElement(); |
- } |
- |
- E singleWhere(bool test(E element)) { |
- int length = this.length; |
- E match = null; |
- bool matchFound = false; |
- for (int i = 0; i < length; i++) { |
- E element = elementAt(i); |
- if (test(element)) { |
- if (matchFound) { |
- throw IterableElementError.tooMany(); |
- } |
- matchFound = true; |
- match = element; |
- } |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- if (matchFound) return match; |
- throw IterableElementError.noElement(); |
- } |
- |
- String join([String separator = ""]) { |
- int length = this.length; |
- if (!separator.isEmpty) { |
- if (length == 0) return ""; |
- String first = "${elementAt(0)}"; |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- StringBuffer buffer = new StringBuffer(first); |
- for (int i = 1; i < length; i++) { |
- buffer.write(separator); |
- buffer.write(elementAt(i)); |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- return buffer.toString(); |
- } else { |
- StringBuffer buffer = new StringBuffer(); |
- for (int i = 0; i < length; i++) { |
- buffer.write(elementAt(i)); |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- return buffer.toString(); |
- } |
- } |
- |
- Iterable<E> where(bool test(E element)) => super.where(test); |
- |
- Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(E element)) => |
- new MappedListIterable<E, dynamic/*=T*/ >(this, f); |
- |
- E reduce(E combine(var value, E element)) { |
- int length = this.length; |
- if (length == 0) throw IterableElementError.noElement(); |
- E value = elementAt(0); |
- for (int i = 1; i < length; i++) { |
- value = combine(value, elementAt(i)); |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- return value; |
- } |
- |
- /*=T*/ fold/*<T>*/( |
- var/*=T*/ initialValue, /*=T*/ combine( |
- var/*=T*/ previousValue, E element)) { |
- var value = initialValue; |
- int length = this.length; |
- for (int i = 0; i < length; i++) { |
- value = combine(value, elementAt(i)); |
- if (length != this.length) { |
- throw new ConcurrentModificationError(this); |
- } |
- } |
- return value; |
- } |
- |
- Iterable<E> skip(int count) => new SubListIterable<E>(this, count, null); |
- |
- Iterable<E> skipWhile(bool test(E element)) => super.skipWhile(test); |
- |
- Iterable<E> take(int count) => new SubListIterable<E>(this, 0, count); |
- |
- Iterable<E> takeWhile(bool test(E element)) => super.takeWhile(test); |
- |
- List<E> toList({bool growable: true}) { |
- List<E> result; |
- if (growable) { |
- result = new List<E>()..length = length; |
- } else { |
- result = new List<E>(length); |
- } |
- for (int i = 0; i < length; i++) { |
- result[i] = elementAt(i); |
- } |
- return result; |
- } |
- |
- Set<E> toSet() { |
- Set<E> result = new Set<E>(); |
- for (int i = 0; i < length; i++) { |
- result.add(elementAt(i)); |
- } |
- return result; |
- } |
-} |
- |
-class SubListIterable<E> extends ListIterable<E> { |
- final Iterable<E> _iterable; // Has efficient length and elementAt. |
- final int _start; |
- /** If null, represents the length of the iterable. */ |
- final int _endOrLength; |
- |
- SubListIterable(this._iterable, this._start, this._endOrLength) { |
- RangeError.checkNotNegative(_start, "start"); |
- if (_endOrLength != null) { |
- RangeError.checkNotNegative(_endOrLength, "end"); |
- if (_start > _endOrLength) { |
- throw new RangeError.range(_start, 0, _endOrLength, "start"); |
- } |
- } |
- } |
- |
- int get _endIndex { |
- int length = _iterable.length; |
- if (_endOrLength == null || _endOrLength > length) return length; |
- return _endOrLength; |
- } |
- |
- int get _startIndex { |
- int length = _iterable.length; |
- if (_start > length) return length; |
- return _start; |
- } |
- |
- int get length { |
- int length = _iterable.length; |
- if (_start >= length) return 0; |
- if (_endOrLength == null || _endOrLength >= length) { |
- return length - _start; |
- } |
- return _endOrLength - _start; |
- } |
- |
- E elementAt(int index) { |
- int realIndex = _startIndex + index; |
- if (index < 0 || realIndex >= _endIndex) { |
- throw new RangeError.index(index, this, "index"); |
- } |
- return _iterable.elementAt(realIndex); |
- } |
- |
- Iterable<E> skip(int count) { |
- RangeError.checkNotNegative(count, "count"); |
- int newStart = _start + count; |
- if (_endOrLength != null && newStart >= _endOrLength) { |
- return new EmptyIterable<E>(); |
- } |
- return new SubListIterable<E>(_iterable, newStart, _endOrLength); |
- } |
- |
- Iterable<E> take(int count) { |
- RangeError.checkNotNegative(count, "count"); |
- if (_endOrLength == null) { |
- return new SubListIterable<E>(_iterable, _start, _start + count); |
- } else { |
- int newEnd = _start + count; |
- if (_endOrLength < newEnd) return this; |
- return new SubListIterable<E>(_iterable, _start, newEnd); |
- } |
- } |
- |
- List<E> toList({bool growable: true}) { |
- int start = _start; |
- int end = _iterable.length; |
- if (_endOrLength != null && _endOrLength < end) end = _endOrLength; |
- int length = end - start; |
- if (length < 0) length = 0; |
- List<E> result = growable ? (new List<E>()..length = length) |
- : new List<E>(length); |
- for (int i = 0; i < length; i++) { |
- result[i] = _iterable.elementAt(start + i); |
- if (_iterable.length < end) throw new ConcurrentModificationError(this); |
- } |
- return result; |
- } |
-} |
- |
-/** |
- * An [Iterator] that iterates a list-like [Iterable]. |
- * |
- * All iterations is done in terms of [Iterable.length] and |
- * [Iterable.elementAt]. These operations are fast for list-like |
- * iterables. |
- */ |
-class ListIterator<E> implements Iterator<E> { |
- final Iterable<E> _iterable; |
- final int _length; |
- int _index; |
- E _current; |
- |
- ListIterator(Iterable<E> iterable) |
- : _iterable = iterable, _length = iterable.length, _index = 0; |
- |
- E get current => _current; |
- |
- bool moveNext() { |
- int length = _iterable.length; |
- if (_length != length) { |
- throw new ConcurrentModificationError(_iterable); |
- } |
- if (_index >= length) { |
- _current = null; |
- return false; |
- } |
- _current = _iterable.elementAt(_index); |
- _index++; |
- return true; |
- } |
-} |
- |
-typedef T _Transformation<S, T>(S value); |
- |
-class MappedIterable<S, T> extends Iterable<T> { |
- final Iterable<S> _iterable; |
- final _Transformation<S, T> _f; |
- |
- factory MappedIterable(Iterable<S> iterable, T function(S value)) { |
- if (iterable is EfficientLength) { |
- return new EfficientLengthMappedIterable<S, T>(iterable, function); |
- } |
- return new MappedIterable<S, T>._(iterable, function); |
- } |
- |
- MappedIterable._(this._iterable, T this._f(S element)); |
- |
- Iterator<T> get iterator => new MappedIterator<S, T>(_iterable.iterator, _f); |
- |
- // Length related functions are independent of the mapping. |
- int get length => _iterable.length; |
- bool get isEmpty => _iterable.isEmpty; |
- |
- // Index based lookup can be done before transforming. |
- T get first => _f(_iterable.first); |
- T get last => _f(_iterable.last); |
- T get single => _f(_iterable.single); |
- T elementAt(int index) => _f(_iterable.elementAt(index)); |
-} |
- |
-class EfficientLengthMappedIterable<S, T> extends MappedIterable<S, T> |
- implements EfficientLength { |
- EfficientLengthMappedIterable(Iterable<S> iterable, T function(S value)) |
- : super._(iterable, function); |
-} |
- |
-class MappedIterator<S, T> extends Iterator<T> { |
- T _current; |
- final Iterator<S> _iterator; |
- final _Transformation<S, T> _f; |
- |
- MappedIterator(this._iterator, T this._f(S element)); |
- |
- bool moveNext() { |
- if (_iterator.moveNext()) { |
- _current = _f(_iterator.current); |
- return true; |
- } |
- _current = null; |
- return false; |
- } |
- |
- T get current => _current; |
-} |
- |
-/** |
- * Specialized alternative to [MappedIterable] for mapped [List]s. |
- * |
- * Expects efficient `length` and `elementAt` on the source iterable. |
- */ |
-class MappedListIterable<S, T> extends ListIterable<T> |
- implements EfficientLength { |
- final Iterable<S> _source; |
- final _Transformation<S, T> _f; |
- |
- MappedListIterable(this._source, T this._f(S value)); |
- |
- int get length => _source.length; |
- T elementAt(int index) => _f(_source.elementAt(index)); |
-} |
- |
- |
-typedef bool _ElementPredicate<E>(E element); |
- |
-class WhereIterable<E> extends Iterable<E> { |
- final Iterable<E> _iterable; |
- final _ElementPredicate<E> _f; |
- |
- WhereIterable(this._iterable, bool this._f(E element)); |
- |
- Iterator<E> get iterator => new WhereIterator<E>(_iterable.iterator, _f); |
-} |
- |
-class WhereIterator<E> extends Iterator<E> { |
- final Iterator<E> _iterator; |
- final _ElementPredicate<E> _f; |
- |
- WhereIterator(this._iterator, bool this._f(E element)); |
- |
- bool moveNext() { |
- while (_iterator.moveNext()) { |
- if (_f(_iterator.current)) { |
- return true; |
- } |
- } |
- return false; |
- } |
- |
- E get current => _iterator.current; |
-} |
- |
-typedef Iterable<T> _ExpandFunction<S, T>(S sourceElement); |
- |
-class ExpandIterable<S, T> extends Iterable<T> { |
- final Iterable<S> _iterable; |
- final _ExpandFunction<S, T> _f; |
- |
- ExpandIterable(this._iterable, Iterable<T> this._f(S element)); |
- |
- Iterator<T> get iterator => new ExpandIterator<S, T>(_iterable.iterator, _f); |
-} |
- |
-class ExpandIterator<S, T> implements Iterator<T> { |
- final Iterator<S> _iterator; |
- final _ExpandFunction<S, T> _f; |
- // Initialize _currentExpansion to an empty iterable. A null value |
- // marks the end of iteration, and we don't want to call _f before |
- // the first moveNext call. |
- Iterator<T> _currentExpansion = const EmptyIterator(); |
- T _current; |
- |
- ExpandIterator(this._iterator, Iterable<T> this._f(S element)); |
- |
- T get current => _current; |
- |
- bool moveNext() { |
- if (_currentExpansion == null) return false; |
- while (!_currentExpansion.moveNext()) { |
- _current = null; |
- if (_iterator.moveNext()) { |
- // If _f throws, this ends iteration. Otherwise _currentExpansion and |
- // _current will be set again below. |
- _currentExpansion = null; |
- _currentExpansion = _f(_iterator.current).iterator; |
- } else { |
- return false; |
- } |
- } |
- _current = _currentExpansion.current; |
- return true; |
- } |
-} |
- |
-class TakeIterable<E> extends Iterable<E> { |
- final Iterable<E> _iterable; |
- final int _takeCount; |
- |
- factory TakeIterable(Iterable<E> iterable, int takeCount) { |
- if (takeCount is! int || takeCount < 0) { |
- throw new ArgumentError(takeCount); |
- } |
- if (iterable is EfficientLength) { |
- return new EfficientLengthTakeIterable<E>(iterable, takeCount); |
- } |
- return new TakeIterable<E>._(iterable, takeCount); |
- } |
- |
- TakeIterable._(this._iterable, this._takeCount); |
- |
- Iterator<E> get iterator { |
- return new TakeIterator<E>(_iterable.iterator, _takeCount); |
- } |
-} |
- |
-class EfficientLengthTakeIterable<E> extends TakeIterable<E> |
- implements EfficientLength { |
- EfficientLengthTakeIterable(Iterable<E> iterable, int takeCount) |
- : super._(iterable, takeCount); |
- |
- int get length { |
- int iterableLength = _iterable.length; |
- if (iterableLength > _takeCount) return _takeCount; |
- return iterableLength; |
- } |
-} |
- |
- |
-class TakeIterator<E> extends Iterator<E> { |
- final Iterator<E> _iterator; |
- int _remaining; |
- |
- TakeIterator(this._iterator, this._remaining) { |
- assert(_remaining is int && _remaining >= 0); |
- } |
- |
- bool moveNext() { |
- _remaining--; |
- if (_remaining >= 0) { |
- return _iterator.moveNext(); |
- } |
- _remaining = -1; |
- return false; |
- } |
- |
- E get current { |
- if (_remaining < 0) return null; |
- return _iterator.current; |
- } |
-} |
- |
-class TakeWhileIterable<E> extends Iterable<E> { |
- final Iterable<E> _iterable; |
- final _ElementPredicate<E> _f; |
- |
- TakeWhileIterable(this._iterable, bool this._f(E element)); |
- |
- Iterator<E> get iterator { |
- return new TakeWhileIterator<E>(_iterable.iterator, _f); |
- } |
-} |
- |
-class TakeWhileIterator<E> extends Iterator<E> { |
- final Iterator<E> _iterator; |
- final _ElementPredicate<E> _f; |
- bool _isFinished = false; |
- |
- TakeWhileIterator(this._iterator, bool this._f(E element)); |
- |
- bool moveNext() { |
- if (_isFinished) return false; |
- if (!_iterator.moveNext() || !_f(_iterator.current)) { |
- _isFinished = true; |
- return false; |
- } |
- return true; |
- } |
- |
- E get current { |
- if (_isFinished) return null; |
- return _iterator.current; |
- } |
-} |
- |
-class SkipIterable<E> extends Iterable<E> { |
- final Iterable<E> _iterable; |
- final int _skipCount; |
- |
- factory SkipIterable(Iterable<E> iterable, int count) { |
- if (iterable is EfficientLength) { |
- return new EfficientLengthSkipIterable<E>(iterable, count); |
- } |
- return new SkipIterable<E>._(iterable, count); |
- } |
- |
- SkipIterable._(this._iterable, this._skipCount) { |
- if (_skipCount is! int) { |
- throw new ArgumentError.value(_skipCount, "count is not an integer"); |
- } |
- RangeError.checkNotNegative(_skipCount, "count"); |
- } |
- |
- Iterable<E> skip(int count) { |
- if (_skipCount is! int) { |
- throw new ArgumentError.value(_skipCount, "count is not an integer"); |
- } |
- RangeError.checkNotNegative(_skipCount, "count"); |
- return new SkipIterable<E>._(_iterable, _skipCount + count); |
- } |
- |
- Iterator<E> get iterator { |
- return new SkipIterator<E>(_iterable.iterator, _skipCount); |
- } |
-} |
- |
-class EfficientLengthSkipIterable<E> extends SkipIterable<E> |
- implements EfficientLength { |
- EfficientLengthSkipIterable(Iterable<E> iterable, int skipCount) |
- : super._(iterable, skipCount); |
- |
- int get length { |
- int length = _iterable.length - _skipCount; |
- if (length >= 0) return length; |
- return 0; |
- } |
-} |
- |
-class SkipIterator<E> extends Iterator<E> { |
- final Iterator<E> _iterator; |
- int _skipCount; |
- |
- SkipIterator(this._iterator, this._skipCount) { |
- assert(_skipCount is int && _skipCount >= 0); |
- } |
- |
- bool moveNext() { |
- for (int i = 0; i < _skipCount; i++) _iterator.moveNext(); |
- _skipCount = 0; |
- return _iterator.moveNext(); |
- } |
- |
- E get current => _iterator.current; |
-} |
- |
-class SkipWhileIterable<E> extends Iterable<E> { |
- final Iterable<E> _iterable; |
- final _ElementPredicate<E> _f; |
- |
- SkipWhileIterable(this._iterable, bool this._f(E element)); |
- |
- Iterator<E> get iterator { |
- return new SkipWhileIterator<E>(_iterable.iterator, _f); |
- } |
-} |
- |
-class SkipWhileIterator<E> extends Iterator<E> { |
- final Iterator<E> _iterator; |
- final _ElementPredicate<E> _f; |
- bool _hasSkipped = false; |
- |
- SkipWhileIterator(this._iterator, bool this._f(E element)); |
- |
- bool moveNext() { |
- if (!_hasSkipped) { |
- _hasSkipped = true; |
- while (_iterator.moveNext()) { |
- if (!_f(_iterator.current)) return true; |
- } |
- } |
- return _iterator.moveNext(); |
- } |
- |
- E get current => _iterator.current; |
-} |
- |
-/** |
- * The always empty [Iterable]. |
- */ |
-class EmptyIterable<E> extends Iterable<E> implements EfficientLength { |
- const EmptyIterable(); |
- |
- Iterator<E> get iterator => const EmptyIterator(); |
- |
- void forEach(void action(E element)) {} |
- |
- bool get isEmpty => true; |
- |
- int get length => 0; |
- |
- E get first { throw IterableElementError.noElement(); } |
- |
- E get last { throw IterableElementError.noElement(); } |
- |
- E get single { throw IterableElementError.noElement(); } |
- |
- E elementAt(int index) { throw new RangeError.range(index, 0, 0, "index"); } |
- |
- bool contains(Object element) => false; |
- |
- bool every(bool test(E element)) => true; |
- |
- bool any(bool test(E element)) => false; |
- |
- E firstWhere(bool test(E element), {E orElse()}) { |
- if (orElse != null) return orElse(); |
- throw IterableElementError.noElement(); |
- } |
- |
- E lastWhere(bool test(E element), {E orElse()}) { |
- if (orElse != null) return orElse(); |
- throw IterableElementError.noElement(); |
- } |
- |
- E singleWhere(bool test(E element), {E orElse()}) { |
- if (orElse != null) return orElse(); |
- throw IterableElementError.noElement(); |
- } |
- |
- String join([String separator = ""]) => ""; |
- |
- Iterable<E> where(bool test(E element)) => this; |
- |
- Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(E element)) => const EmptyIterable(); |
- |
- E reduce(E combine(E value, E element)) { |
- throw IterableElementError.noElement(); |
- } |
- |
- /*=T*/ fold/*<T>*/( |
- var/*=T*/ initialValue, /*=T*/ combine( |
- var/*=T*/ previousValue, E element)) { |
- return initialValue; |
- } |
- |
- Iterable<E> skip(int count) { |
- RangeError.checkNotNegative(count, "count"); |
- return this; |
- } |
- |
- Iterable<E> skipWhile(bool test(E element)) => this; |
- |
- Iterable<E> take(int count) { |
- RangeError.checkNotNegative(count, "count"); |
- return this; |
- } |
- |
- Iterable<E> takeWhile(bool test(E element)) => this; |
- |
- List<E> toList({bool growable: true}) => growable ? <E>[] : new List<E>(0); |
- |
- Set<E> toSet() => new Set<E>(); |
-} |
- |
-/** The always empty iterator. */ |
-class EmptyIterator<E> implements Iterator<E> { |
- const EmptyIterator(); |
- bool moveNext() => false; |
- E get current => null; |
-} |
- |
-/** |
- * Creates errors throw by [Iterable] when the element count is wrong. |
- */ |
-abstract class IterableElementError { |
- /** Error thrown thrown by, e.g., [Iterable.first] when there is no result. */ |
- static StateError noElement() => new StateError("No element"); |
- /** Error thrown by, e.g., [Iterable.single] if there are too many results. */ |
- static StateError tooMany() => new StateError("Too many elements"); |
- /** Error thrown by, e.g., [List.setRange] if there are too few elements. */ |
- static StateError tooFew() => new StateError("Too few elements"); |
-} |