// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
// This module is browser compatible.

/**
 * Builds N-tuples of elements from the given N arrays with matching indices, stopping when the smallest array's end is reached
 * Example:
 *
 * ```ts
 * import { zip } from "https://deno.land/std@$STD_VERSION/collections/mod.ts";
 * import { assertEquals } from "https://deno.land/std@$STD_VERSION/testing/asserts.ts";
 *
 * const numbers = [ 1, 2, 3, 4 ];
 * const letters = [ 'a', 'b', 'c', 'd' ];
 * const pairs = zip(numbers, letters);
 *
 * assertEquals(pairs, [
 *     [ 1, 'a' ],
 *     [ 2, 'b' ],
 *     [ 3, 'c' ],
 *     [ 4, 'd' ],
 * ]);
 * ```
 */

import { minOf } from "./min_of.ts";

export function zip<T extends unknown[]>(
  ...arrays: { [K in keyof T]: T[K][] }
): T[] {
  let minLength = minOf(arrays, (it) => it.length);
  if (minLength === undefined) minLength = 0;

  const ret: T[] = new Array(minLength);

  for (let i = 0; i < minLength; i += 1) {
    const arr = arrays.map((it) => it[i]);
    ret[i] = arr as T;
  }

  return ret;
}
