```ts
interface Cut { takings: number; pieces: number[] }
/** Cut a fabric roll for the greatest takings the price board allows. */
export function cutRoll(length: number, board: [number, number][]): Cut {
  if (!Number.isInteger(length) || length < 0) {
    throw new Error("length must be a non-negative whole number");
  }
  const order = [...board].sort((a, b) => b[0] - a[0]);
  const best: number[] = new Array(length + 1).fill(0);
  for (let metres = 1; metres <= length; metres++) {
    best[metres] = -1;
    for (const [piece, price] of order) {
      if (piece <= metres && price + best[metres - piece] > best[metres]) {
        best[metres] = price + best[metres - piece];
        taken[metres] = piece;
      }
    }
  }

  const pieces: number[] = [];
  let currentMetres = length;
  while (currentMetres > 0) {
    if (taken[currentMetres] === 0) {
      pieces.push(currentMetres);
      currentMetres -= 1;
    } else {
      pieces.push(taken[currentMetres]);
      currentMetres -= taken[currentMetres];
    }
  }

  return { takings: best[length], pieces.reverse() };
}
```