import { Build, Promised } from "./utils";
import "./select";
import "./array";

declare global {
  interface Generator<T = unknown, TReturn = any, TNext = unknown> {
    /**
     * Returns the minimum value in a sequence of number values.
     * @returns The minimum value in the sequence.
     */
    min(this: Generator<number, TReturn, TNext>): number;
    /**
     * Invokes a transform function on each element of a generic
     * sequence and returns the minimum resulting value.
     * @param selector A transform function to apply to each element.
     * @returns The minimum value in the sequence.
     */
    min(selector: (item: T) => number): number;
  }

  interface AsyncGenerator<T = unknown, TReturn = any, TNext = unknown> {
    /**
     * Returns the minimum value in a sequence of number values.
     * @returns The minimum value in the sequence.
     */
    min(this: Generator<number, TReturn, TNext>): Promise<number>;
    /**
     * Invokes a transform function on each element of a generic
     * sequence and returns the minimum resulting value.
     * @param selector A transform function to apply to each element.
     * @returns The minimum value in the sequence.
     */
    min(selector: (item: T) => Promised<number>): Promise<number>;
  }
}

Build(
  "min",
  function (selector = (i) => i as number) {
    return Math.min(...this.select(selector).array());
  },
  async function (selector = (i) => i as number) {
    return Math.min(...(await this.select(selector).array()));
  }
);
