// retoor <retoor@molodetz.nl>

export class Poller {
  constructor(fn, intervalMs, options = {}) {
    this._fn = fn;
    this._interval = intervalMs;
    this._pauseHidden = !!options.pauseHidden;
    this._timer = null;
    this._busy = false;
    if (options.immediate !== false) this.tick();
    this.start();
  }

  start() {
    if (this._timer) return;
    this._timer = window.setInterval(() => this.tick(), this._interval);
  }

  stop() {
    if (this._timer) {
      window.clearInterval(this._timer);
      this._timer = null;
    }
  }

  async tick() {
    if (this._pauseHidden && document.hidden) return;
    if (this._busy) return;
    this._busy = true;
    try {
      await this._fn();
    } catch (error) {
      return;
    } finally {
      this._busy = false;
    }
  }
}
