world-population
Version:
World Population Counter, based on UN World Population Prospects data
86 lines (69 loc) • 2.5 kB
text/typescript
import { estimates } from "./data";
/**
* Look up an UN estimated population for a specific year
*/
function lookupPopulation(date: Date) {
const result = estimates.find((e) => e.year == date.getFullYear());
if (result) {
return result.pop * 1000;
} else {
throw new Error("Year out of range.");
}
}
/**
* Estimate the world population at a moment in time. Defaults to now.
*/
export function estimate(date = new Date()) {
const start = new Date(date.getFullYear(), 0);
const end = new Date(date.getFullYear() + 1, 0);
const startPop = lookupPopulation(start);
const endPop = lookupPopulation(end);
const increase = endPop - startPop;
const progress =
(date.getTime() - start.getTime()) / (end.getTime() - start.getTime());
return Math.round(startPop + increase * progress);
}
/**
* The average number of milliseconds between each birth at a moment in time.
* Defaults to now. Useful for incrementing counters.
*/
export function interval(date = new Date()) {
const start = new Date(date.getFullYear(), 0);
const end = new Date(date.getFullYear() + 1, 0);
const startPop = lookupPopulation(start);
const endPop = lookupPopulation(end);
const increase = endPop - startPop;
const length = end.getTime() - start.getTime();
return Math.round(length / increase);
}
/**
* Estimate the date that the population will reach a certain value (for the
* first time)
* @param population
*/
export function estimateDate(population: number) {
const populationThousands = population / 1000;
// Find first year with a population larger that the population.
const after = estimates.find((n) => n.pop > populationThousands);
if (!after) {
throw new Error("Population not predicted to reach " + population);
}
// And the year before.
const before = estimates.find((n) => n.year == after.year - 1);
if (!before) {
throw new Error("Data not available.");
}
// Assuming linear growth, what percentage of the year will have elapsed
// before we reach the population?
const percentageThroughYear =
(populationThousands - before.pop) / (after.pop - before.pop);
// How many milliseconds are there in this year?
const start = new Date(before.year, 0);
const end = new Date(after.year, 0);
const milliseconds = end.getTime() - start.getTime();
// Calculate the instant we will hit this population.
const instant = new Date(
start.getTime() + milliseconds * percentageThroughYear
);
return instant;
}