// API for working with changes to document text

/** Denotes a region in the document, based on character indicices
 */
export type Range = {
  /** The starting index of the span, 0-based, inclusive
   */
  from: number;

  /** The ending index of the span, 0-based, exclusive
   */
  to: number;
};

/** A modification to the document */
export type TextChange = {
  /** The new text */
  inserted: string;

  /** The modified range **before** this change took effect.
   *
   * Example: "aaabbbccc" => "aaaccc", oldRange is [3, 6)
   */
  oldRange: Range;

  /** The modified range **after** this change took effect.
   *
   * Example: "aaabbbccc" => "aaaccc", newRange is [3, 3)
   */
  newRange: Range;
};

/** Get this distance between the start and end of a range */
export function rangeLength(range: Range): number {
  return range.to - range.from;
}

export function rangesOverlap(a: Range, b: Range): boolean {
  // `b.from >= a.to` => "b" starts after "a"
  // `a.from >= b.to` => "b" ends before "a"
  // if neither is true these two ranges must overlap
  return !(b.from >= a.to || a.from >= b.to);
}