Functional Weave
Code in TypeScript

energy.meter-advance@1.0.0

impl/typescript.ts

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.
 */
export function meterAdvance(openingRead: number, closingRead: number, digits: number): number {
  if (!Number.isInteger(digits) || digits < 1 || digits > 15) {
    throw new 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) {
      throw new 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;
}