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

declare global {
  interface Generator<T = unknown, TReturn = any, TNext = unknown> {
    prepend<TItem>(item: TItem): Generator<TItem | T, TNext, TReturn>;
  }

  interface AsyncGenerator<T = unknown, TReturn = any, TNext = unknown> {
    prepend<TItem>(item: Promised<TItem>): AsyncGenerator<T | TItem, TNext, TReturn>;
  }
}

Build(
  "prepend",
  function* (extra) {
    yield extra;
    for (const item of this) {
      yield item;
    }
  },
  async function* (extra) {
    yield await Promise.resolve(extra);
    for await (const item of this) {
      yield item;
    }
  }
);
