forked from wokalski/covid-19charts.com
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Data.re
120 lines (110 loc) · 3.17 KB
/
Data.re
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
module Map: {
type t('key, 'value) constraint 'key = string;
let keys: t('key, 'value) => array('key);
let get: (t('key, 'value), 'key) => 'value;
let get_opt: (t('key, 'value), 'key) => option('value);
let map: ((. 'value) => 'b, t('key, 'value)) => t('key, 'b);
let entries: t('key, 'value) => array(('key, 'value));
let fromArray: array(('key, 'value)) => t('key, 'value);
let set: (t('key, 'value), 'key, 'value) => unit;
let empty: unit => t('key, 'value);
} = {
type t('key, 'value) = Js.Dict.t('value) constraint 'key = string;
let keys = Js.Dict.keys;
let get = Js.Dict.unsafeGet;
let get_opt = Js.Dict.get;
let map = Js.Dict.map;
let entries = Js.Dict.entries;
let fromArray = Js.Dict.fromArray;
let set = Js.Dict.set;
let empty = Js.Dict.empty;
};
let randomColor = index => {
let random = 360. *. (Js.Int.toFloat(index) /. 100.);
{j|hsla($random,70%,70%,0.8)|j};
};
[@bs.val] external require: string => 'a = "require";
type countryId = string;
type location = {
country: string,
provinceOrState: option(string),
name: string,
};
type day = string;
type dataPoints = Map.t(day, int);
let locations: Map.t(countryId, location) =
require("../data/locations.json");
let days: array(day) = require("../data/days.json");
let data: Map.t(countryId, dataPoints) = require("../data/data.json");
let countryIds = Map.keys(locations);
let dayToIndex =
Js.Array.mapi((day, index) => {(day, index)}, days) |> Map.fromArray;
let colors =
Map.keys(locations)
|> Js.Array.mapi((location, index) => (location, randomColor(index)))
|> Map.fromArray;
let calendar = {
Js.Array.map(
day => {
let row = Js.Dict.empty();
Js.Dict.set(row, "name", day);
Js.Array.forEach(
countryId => {
Js.Dict.set(
row,
Map.get(locations, countryId).name,
Map.get(Map.get(data, countryId), day) |> Js.Int.toString,
);
},
countryIds,
);
row;
},
days,
);
};
let alignToDay0 = threshold => {
let data =
Map.map(
(. dataPoints) => {
Map.entries(dataPoints)
|> Js.Array.map(((date, value)) =>
(Map.get(dayToIndex, date), value)
)
|> Js.Array.sortInPlaceWith((a, b) => {compare(a |> fst, b |> fst)})
|> Js.Array.map(((_, value)) => value)
|> Js.Array.filter(value => value >= threshold)
|> Js.Array.mapi((value, index) => {
(Js.Int.toString(index), value)
})
|> Map.fromArray
},
data,
);
Array.init(
Js.Array.length(days),
day => {
let row = Js.Dict.empty();
let day = Js.Int.toString(day);
Js.Dict.set(row, "name", day);
Js.Array.forEach(
countryId => {
switch (Map.get_opt(Map.get(data, countryId), day)) {
| Some(number) =>
Js.Dict.set(
row,
Map.get(locations, countryId).name,
number |> Js.Int.toString,
)
| None => ()
}
},
countryIds,
);
row;
},
);
};
let allLocations =
Map.entries(locations)
|> Js.Array.map(((label, value)) => {ReactSelect.label, value});