Skip to content

Commit d836ca5

Browse files
authored
performance: Override .elementAt in CachingIterable (#152477)
Add a more efficient override of `Iterable.elementAt` in `CachingIterable`. Closes #152476
1 parent cadac6b commit d836ca5

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

packages/flutter/lib/src/foundation/basic_types.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,22 @@ class CachingIterable<E> extends IterableBase<E> {
181181
return _results.length;
182182
}
183183

184+
@override
185+
E elementAt(int index) {
186+
RangeError.checkNotNegative(index, 'index');
187+
while (_results.length <= index) {
188+
if (!_fillNext()) {
189+
throw IndexError.withLength(
190+
index,
191+
_results.length,
192+
indexable: this,
193+
name: 'index',
194+
);
195+
}
196+
}
197+
return _results[index];
198+
}
199+
184200
@override
185201
List<E> toList({ bool growable = true }) {
186202
_precacheEntireList();

packages/flutter/test/foundation/caching_iterable_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,19 @@ void main() {
107107
expect(expanded2, equals(<int>[1, 1, 2, 2, 3, 3, 4, 4, 5, 5]));
108108
expect(yieldCount, equals(5));
109109
});
110+
111+
test('The Caching Iterable: elementAt correctness', () {
112+
final Iterable<int> integers = CachingIterable<int>(range(1, 5).iterator);
113+
expect(yieldCount, equals(0));
114+
115+
expect(() => integers.elementAt(-1), throwsRangeError);
116+
117+
expect(integers.elementAt(1), equals(2));
118+
expect(integers.elementAt(0), equals(1));
119+
expect(integers.elementAt(2), equals(3));
120+
expect(integers.elementAt(4), equals(5));
121+
expect(integers.elementAt(3), equals(4));
122+
123+
expect(() => integers.elementAt(5), throwsRangeError);
124+
});
110125
}

0 commit comments

Comments
 (0)