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

declare global {
  interface Generator<T = unknown, TReturn = any, TNext = unknown> {
    select<TResult>(
      selector: (item: T, index: number) => TResult
    ): Generator<TResult, TReturn, TNext>;
  }

  interface AsyncGenerator<T = unknown, TReturn = any, TNext = unknown> {
    select<TResult>(
      selector: (item: T, index: number) => Promised<TResult>
    ): AsyncGenerator<TResult, TReturn, TNext>;
  }
}

Build(
  "select",
  function* (selector) {
    let index = 0;
    for (const item of this) {
      yield selector(item, index);
      index++;
    }
  },
  async function* (selector) {
    let index = 0;
    for await (const item of this) {
      yield await Promise.resolve(selector(item, index));
      index++;
    }
  }
);
