| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart.collection; | 5 part of dart.collection; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Abstract implementation of a list. | 8 * Abstract implementation of a list. |
| 9 * | 9 * |
| 10 * All operations are defined in terms of `length`, `operator[]`, | 10 * All operations are defined in terms of `length`, `operator[]`, |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 match = element; | 134 match = element; |
| 135 } | 135 } |
| 136 if (length != this.length) { | 136 if (length != this.length) { |
| 137 throw new ConcurrentModificationError(this); | 137 throw new ConcurrentModificationError(this); |
| 138 } | 138 } |
| 139 } | 139 } |
| 140 if (matchFound) return match; | 140 if (matchFound) return match; |
| 141 throw new StateError("No matching element"); | 141 throw new StateError("No matching element"); |
| 142 } | 142 } |
| 143 | 143 |
| 144 E min([int compare(E a, E b)]) { | |
| 145 if (length == 0) return null; | |
| 146 if (compare == null) { | |
| 147 var defaultCompare = Comparable.compare; | |
| 148 compare = defaultCompare; | |
| 149 } | |
| 150 E min = this[0]; | |
| 151 int length = this.length; | |
| 152 for (int i = 1; i < length; i++) { | |
| 153 E element = this[i]; | |
| 154 if (compare(min, element) > 0) { | |
| 155 min = element; | |
| 156 } | |
| 157 if (length != this.length) { | |
| 158 throw new ConcurrentModificationError(this); | |
| 159 } | |
| 160 } | |
| 161 return min; | |
| 162 } | |
| 163 | |
| 164 E max([int compare(E a, E b)]) { | |
| 165 if (length == 0) return null; | |
| 166 if (compare == null) { | |
| 167 var defaultCompare = Comparable.compare; | |
| 168 compare = defaultCompare; | |
| 169 } | |
| 170 E max = this[0]; | |
| 171 int length = this.length; | |
| 172 for (int i = 1; i < length; i++) { | |
| 173 E element = this[i]; | |
| 174 if (compare(max, element) < 0) { | |
| 175 max = element; | |
| 176 } | |
| 177 if (length != this.length) { | |
| 178 throw new ConcurrentModificationError(this); | |
| 179 } | |
| 180 } | |
| 181 return max; | |
| 182 } | |
| 183 | |
| 184 String join([String separator = ""]) { | 144 String join([String separator = ""]) { |
| 185 int length = this.length; | 145 int length = this.length; |
| 186 if (!separator.isEmpty) { | 146 if (!separator.isEmpty) { |
| 187 if (length == 0) return ""; | 147 if (length == 0) return ""; |
| 188 String first = "${this[0]}"; | 148 String first = "${this[0]}"; |
| 189 if (length != this.length) { | 149 if (length != this.length) { |
| 190 throw new ConcurrentModificationError(this); | 150 throw new ConcurrentModificationError(this); |
| 191 } | 151 } |
| 192 StringBuffer buffer = new StringBuffer(first); | 152 StringBuffer buffer = new StringBuffer(first); |
| 193 for (int i = 1; i < length; i++) { | 153 for (int i = 1; i < length; i++) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 207 } | 167 } |
| 208 } | 168 } |
| 209 return buffer.toString(); | 169 return buffer.toString(); |
| 210 } | 170 } |
| 211 } | 171 } |
| 212 | 172 |
| 213 Iterable<E> where(bool test(E element)) => new WhereIterable<E>(this, test); | 173 Iterable<E> where(bool test(E element)) => new WhereIterable<E>(this, test); |
| 214 | 174 |
| 215 Iterable map(f(E element)) => new MappedListIterable(this, f); | 175 Iterable map(f(E element)) => new MappedListIterable(this, f); |
| 216 | 176 |
| 217 reduce(var initialValue, combine(var previousValue, E element)) { | 177 E reduce(E combine(E previousValue, E element)) { |
| 218 return fold(initialValue, combine); | 178 if (length == 0) throw new StateError("No elements"); |
| 179 E value = this[0]; |
| 180 for (int i = 1; i < length; i++) { |
| 181 value = combine(value, this[i]); |
| 182 } |
| 183 return value; |
| 219 } | 184 } |
| 220 | 185 |
| 221 fold(var initialValue, combine(var previousValue, E element)) { | 186 fold(var initialValue, combine(var previousValue, E element)) { |
| 222 var value = initialValue; | 187 var value = initialValue; |
| 223 int length = this.length; | 188 int length = this.length; |
| 224 for (int i = 0; i < length; i++) { | 189 for (int i = 0; i < length; i++) { |
| 225 value = combine(value, this[i]); | 190 value = combine(value, this[i]); |
| 226 if (length != this.length) { | 191 if (length != this.length) { |
| 227 throw new ConcurrentModificationError(this); | 192 throw new ConcurrentModificationError(this); |
| 228 } | 193 } |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 for (int i = startIndex; i >= 0; i--) { | 423 for (int i = startIndex; i >= 0; i--) { |
| 459 if (this[i] == element) { | 424 if (this[i] == element) { |
| 460 return i; | 425 return i; |
| 461 } | 426 } |
| 462 } | 427 } |
| 463 return -1; | 428 return -1; |
| 464 } | 429 } |
| 465 | 430 |
| 466 Iterable<E> get reversed => new ReversedListIterable(this); | 431 Iterable<E> get reversed => new ReversedListIterable(this); |
| 467 } | 432 } |
| OLD | NEW |