// src/utils/loopingArray.ts
var LoopingArrayCalculator = class _LoopingArrayCalculator {
  constructor(length, isLooping = true, allowedOverScroll = 0.1) {
    if (allowedOverScroll < 0 || length < 1) {
      throw new Error("Invalid parameters: allowedOverScroll >= 0 and length >= 1 must be true");
    }
    this.length = length;
    this.isLooping = isLooping;
    this.allowedOverScroll = allowedOverScroll;
  }
  getCorrectedPosition(position) {
    if (!this.isLooping) {
      return Math.max(-this.allowedOverScroll, Math.min(this.allowedOverScroll + this.length - 1, position));
    }
    if (position >= this.length) {
      return position % this.length;
    }
    if (position < 0) {
      return this.length - Math.abs(position) % this.length;
    }
    return position;
  }
  static withoutOffset(position) {
    return position + _LoopingArrayCalculator.getOffset(position);
  }
  static getOffset(position) {
    return Math.round(position) - position;
  }
  /**
   * @return absolute distance forwards or Infinity when the target cannot be reached (only possible when not isLooping)
   */
  getDistanceDirectional(position, target, direction) {
    if (!this.isLooping && (position < -this.allowedOverScroll || position > this.allowedOverScroll + this.length - 1)) {
      throw new Error("Invalid parameters: position is out of bounds.");
    }
    const isForwardInvalid = direction === 1 && position > target;
    const isBackwardInvalid = direction === -1 && target < position;
    if (!this.isLooping && (isForwardInvalid || isBackwardInvalid)) {
      return Infinity;
    }
    if (direction === -1) {
      return this.getDistanceDirectional(target, position, 1);
    }
    position = this.getCorrectedPosition(position);
    target = this.getCorrectedPosition(target);
    let distance = (target - position) * direction;
    if (distance < 0) {
      distance = this.length - Math.abs(position) % this.length + target;
    }
    return distance;
  }
  getDistanceForward(position, target) {
    return this.getDistanceDirectional(position, target, 1);
  }
  getDistanceBackward(position, target) {
    return this.getDistanceDirectional(position, target, -1);
  }
  getDistance(position, target) {
    const forwardDistance = this.getDistanceForward(position, target);
    const backwardDistance = this.getDistanceBackward(position, target);
    return Math.min(forwardDistance, backwardDistance);
  }
  getBestDirection(position, target) {
    const forwardDistance = this.getDistanceForward(position, target);
    const backwardDistance = this.getDistanceBackward(position, target);
    return forwardDistance < backwardDistance ? 1 : -1;
  }
};
export {
  LoopingArrayCalculator
};
//# sourceMappingURL=loopingArray.js.map