791 bytes · the TypeScript implementation · view raw
/** * Units a meter advanced between two reads. A closing read lower than the * opening read means the register rolled over past all nines, once. */exportfunction meterAdvance(openingRead: number, closingRead: number, digits: number): number {
if (!Number.isInteger(digits) || digits < 1 || digits > 15) {
thrownew RangeError(`digits must be a whole number from 1 to 15, received ${digits}`);
}
const span = 10 ** digits;
for (const read of [openingRead, closingRead]) {
if (!Number.isInteger(read) || read < 0 || read >= span) {
thrownew RangeError(`reads must be whole numbers from 0 to ${span - 1} for a ${digits}-digit meter, received ${read}`);
}
}
return closingRead >= openingRead ? closingRead - openingRead : closingRead + span - openingRead;
}