Functional Weave
Code in Rust

energy.degree-days@1.0.0

impl/typescript.ts

1,015 bytes · the TypeScript implementation · view raw

import { type DegreeDays } from "./energy_degree_days_types.ts";

const LIMIT = 1000; // 100.0 °C in tenths

function checkTemperature(what: string, value: number): void {
  if (!Number.isInteger(value) || value < -LIMIT || value > LIMIT) {
    throw new RangeError(`${what} must be whole tenths of a degree from -1000 to 1000, received ${value}`);
  }
}

/**
 * Heating and cooling degree days in tenths: each day adds how far its mean
 * fell below (heating) or rose above (cooling) the base.
 */
export function degreeDays(dailyMeanTemperatures: readonly number[], baseTemperature: number): DegreeDays {
  checkTemperature("base temperature", baseTemperature);
  let heating = 0;
  let cooling = 0;
  for (const mean of dailyMeanTemperatures) {
    checkTemperature("daily mean temperature", mean);
    if (mean < baseTemperature) heating += baseTemperature - mean;
    else if (mean > baseTemperature) cooling += mean - baseTemperature;
  }
  return { heating, cooling, days: dailyMeanTemperatures.length };
}