* Scales a value from one range to another.
 * @param {Object} params - The scaling parameters.
 * @param {number} params.inMinimum - The lower bound of the original range.
 * @param {number} params.inMaximum - The upper bound of the original range.
 * @param {number} [params.outMinimum=0] - The lower bound of the target range.
 * @param {number} [params.outMaximum=1] - The upper bound of the target range.
 * @param {number} params.value - The value to scale.
 * @returns {number} The scaled value.
 * @throws {Error} Will throw an error if inMinimum equals inMaximum (to prevent division by zero).
 * // Scale a value from [0, 10] to [0, 100]
 * scale({ inMinimum: 0, inMaximum: 10, outMinimum: 0, outMaximum: 100, value: 5 });
 * // Scale a value from [0, 100] to the default range [0, 1]
 * const normalizedValue = scale({ inMinimum: 0, inMaximum: 100, value: 50 });
 * console.log(normalizedValue); // Output: 0.5
export const scale: Scale = params => {
  const { inMinimum, inMaximum, outMinimum = 0, outMaximum = 1, value } = params
  if (inMinimum === inMaximum)
      `inMinimum (${inMinimum}) cannot equal inMaximum (${inMaximum}) as this leads to a division by 0.`,
    ((value - inMinimum) * (outMaximum - outMinimum)) /
      (inMaximum - inMinimum) +