export interface SplinePoint {
  x: number;
  y: number;
}

/**
 * Props to Rob Spencer at scaled innovation for his post on splining between points
 * http://scaledinnovation.com/analytics/splines/aboutSplines.html
 */
export function splineCurve(
  firstPoint: SplinePoint & { skip?: boolean },
  middlePoint: SplinePoint,
  afterPoint: SplinePoint,
  t: number
): {
  previous: SplinePoint;
  next: SplinePoint;
};

export interface MonotoneSplinePoint extends SplinePoint {
  skip: boolean;
  cp1x?: number;
  cp1y?: number;
  cp2x?: number;
  cp2y?: number;
}

/**
 * This function calculates Bézier control points in a similar way than |splineCurve|,
 * but preserves monotonicity of the provided data and ensures no local extremums are added
 * between the dataset discrete points due to the interpolation.
 * @see https://en.wikipedia.org/wiki/Monotone_cubic_interpolation
 */
export function splineCurveMonotone(points: readonly MonotoneSplinePoint[], indexAxis?: 'x' | 'y'): void;
