|
|
@@ -3,7 +3,7 @@ import groupBy from 'lodash/groupBy';
|
|
|
import flatten from 'lodash/flatten';
|
|
|
import differenceInDays from 'date-fns/differenceInDays';
|
|
|
import addDays from 'date-fns/addDays';
|
|
|
-import { Cases, Data, DataPoint, CountryCases, CountryDataPoint } from '../types';
|
|
|
+import { Cases, Data, DataPoint, CountryCase, CountryCases, CountryDataPoint } from '../types';
|
|
|
|
|
|
// Start the regression line after this many cases have been recorded in total
|
|
|
const regressionStart = 50;
|
|
|
@@ -145,8 +145,43 @@ function combineData(items: Data[]): Data {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+function fillData(countryCases: CountryCases): CountryCases {
|
|
|
+ const times: number[] = Array.from(
|
|
|
+ new Set(
|
|
|
+ flatten(
|
|
|
+ countryCases.map(({ dataSource: { cases } }) => cases.map(({ date }) => date.getTime())),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ).sort((timeA, timeB) => timeA - timeB);
|
|
|
+
|
|
|
+ return countryCases.map(
|
|
|
+ ({ country, dataSource }): CountryCase => ({
|
|
|
+ country,
|
|
|
+ dataSource: {
|
|
|
+ ...dataSource,
|
|
|
+ cases: times.reduce((last: Cases, time: number, index: number): Cases => {
|
|
|
+ const matchingCase = dataSource.cases.find(({ date }) => date.getTime() === time);
|
|
|
+ if (matchingCase) {
|
|
|
+ return [...last, matchingCase];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ ...last,
|
|
|
+ {
|
|
|
+ date: new Date(time),
|
|
|
+ value: 0,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ }, []),
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
export function processCases(countryCases: CountryCases, cumulative = true): Data {
|
|
|
- const data = countryCases.map(({ country, dataSource: { cases } }) =>
|
|
|
+ const filledData = fillData(countryCases);
|
|
|
+
|
|
|
+ const data = filledData.map(({ country, dataSource: { cases } }) =>
|
|
|
processCountryCases(cases, cumulative).map(({ date, xValue, value, regression }) => ({
|
|
|
date,
|
|
|
xValue,
|