function roundDec(val: number, dec: number) {
  return Math.round(val * (dec = 10 ** dec)) / dec;
}

export const SPACE_BETWEEN = 1;
export const SPACE_AROUND = 2;
export const SPACE_EVENLY = 3;

const coord = (i: number, offs: number, iwid: number, gap: number) => roundDec(offs + i * (iwid + gap), 6);

export type Each = (idx: number, offPct: number, dimPct: number) => void;

/**
 * @internal
 */
export function distribute(numItems: number, sizeFactor: number, justify: number, onlyIdx: number | null, each: Each) {
  let space = 1 - sizeFactor;

  /* eslint-disable no-multi-spaces */
  // prettier-ignore
  let gap = (
    justify === SPACE_BETWEEN ? space / (numItems - 1) :
    justify === SPACE_AROUND  ? space / (numItems  )   :
    justify === SPACE_EVENLY  ? space / (numItems + 1) : 0
  );

  if (isNaN(gap) || gap === Infinity) {
    gap = 0;
  }

  // prettier-ignore
  let offs = (
    justify === SPACE_BETWEEN ? 0       :
    justify === SPACE_AROUND  ? gap / 2 :
    justify === SPACE_EVENLY  ? gap     : 0
  );
  /* eslint-enable */

  let iwid = sizeFactor / numItems;
  let _iwid = roundDec(iwid, 6);

  if (onlyIdx == null) {
    for (let i = 0; i < numItems; i++) {
      each(i, coord(i, offs, iwid, gap), _iwid);
    }
  } else {
    each(onlyIdx, coord(onlyIdx, offs, iwid, gap), _iwid);
  }
}
