blob: 9c50ce6bd2bbb5f52d6aa23bf136b22d78e9e823 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/// A [map] function that calls the function with an enumeration as well as the
/// value.
Iterable<U> indexMap<T, U>(
Iterable<T> iterable, U Function(int index, T value) func) sync* {
int index = 0;
for (final T value in iterable) {
yield func(index, value);
++index;
}
}
/// Performs like [forEach] but invokes [func] with an enumeration.
void enumerate<T>(Iterable<T> iterable, void Function(int, T) func) {
int count = 0;
for (final T value in iterable) {
func(count, value);
++count;
}
}
/// A [map] function that takes in 2 iterables. The [Iterable]s must be of
/// equal length.
Iterable<V> map2<T, U, V>(
Iterable<T> ts, Iterable<U> us, V Function(T t, U u) func) sync* {
final Iterator<T> itt = ts.iterator;
final Iterator<U> itu = us.iterator;
while (itu.moveNext() && itt.moveNext()) {
yield func(itt.current, itu.current);
}
if (itu.moveNext() || itt.moveNext()) {
throw ArgumentError('Iterables aren\'t of equal length.');
}
}
/// A [map] function that takes in 3 iterables. The [Iterable]s must be of
/// equal length.
Iterable<V> map3<T, U, V, W>(Iterable<T> ts, Iterable<U> us, Iterable<W> ws,
V Function(T t, U u, W w) func) sync* {
final Iterator<T> itt = ts.iterator;
final Iterator<U> itu = us.iterator;
final Iterator<W> itw = ws.iterator;
while (itu.moveNext() && itt.moveNext() && itw.moveNext()) {
yield func(itt.current, itu.current, itw.current);
}
if (itu.moveNext() || itt.moveNext() || itw.moveNext()) {
throw ArgumentError('Iterables aren\'t of equal length.');
}
}
/// Adds [value] to the end of [ts].
Iterable<T> followedByOne<T>(Iterable<T> ts, T value) sync* {
for (final T item in ts) {
yield item;
}
yield value;
}
Iterable<int> _count() sync* {
int x = 0;
while (true) {
yield x++;
}
}
/// All integers starting at zero.
final Iterable<int> wholeNumbers = _count();
/// Repeats an [item] [n] times.
Iterable<T> repeat<T>(T item, int n) sync* {
for (int i = 0; i < n; ++i) {
yield item;
}
}