// 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;
  }
}
