class PreInitQueue<T> {
  private dependency: T | null = null;

  private queue: ((dependency: T) => Promise<void>)[] = [];

  receiveDependency = (dependency: T) => {
    this.dependency = dependency;
    for (const fn of this.queue) {
      fn(dependency);
    }
    this.queue = [];
  };

  runWithDependency = async <T2>(fn: (dependency: T) => T2): Promise<T2> => {
    if (this.dependency) {
      return fn(this.dependency);
    }
    return new Promise<T2>((resolve) => {
      this.queue.push(async (dependency) => {
        resolve(fn(dependency));
      });
    });
  };
}

export default PreInitQueue;
