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

declare global {
  interface Generator<T = unknown, TReturn = any, TNext = unknown> {
    skip_while(
      predicate: (item: T, index: number) => boolean
    ): Generator<T, TReturn, TNext>;
  }

  interface AsyncGenerator<T = unknown, TReturn = any, TNext = unknown> {
    skip_while(
      predicate: (item: T, index: number) => Promised<boolean>
    ): AsyncGenerator<T, TReturn, TNext>;
  }
}

Build(
  "skip_while",
  function* (predicate) {
    let index = 0;
    let skipping = true;
    for (const item of this) {
      if (!skipping || !predicate(item, index)) {
        yield item;
        skipping = false;
      }

      index++;
    }
  },
  async function* (predicate) {
    let index = 0;
    let skipping = true;
    for await (const item of this) {
      if (!skipping || !predicate(item, index)) {
        yield item;
        skipping = false;
      }

      index++;
    }
  }
);
