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
import { fetch } from "https://esm.town/v/std/fetch";
export const nearestOpenStation = async ({ lon, lat }) => {
lon = +lon;
lat = +lat;
function dist(station) {
return Math.sqrt(
Math.pow(station.lat - lat, 2) + Math.pow(station.lon - lon, 2)
);
}
const {
data: { stations: stationInfo },
} = await fetch(
"https://gbfs.citibikenyc.com/gbfs/en/station_status.json"
).then((r) => r.json());
const stationInfoMap = new Map(
stationInfo.map((info) => [info.station_id, info])
);
const {
data: { stations },
} = await fetch(
"https://gbfs.citibikenyc.com/gbfs/en/station_information.json"
).then((r) => r.json());
const nearest = stations
.map((station) => {
const info = stationInfoMap.get(station.station_id);
return {
...station,
info,
};
})
.filter((station) => {
return station.info.num_docks_available > 0;
})
.slice()
.sort((a, b) => {
return dist(a) - dist(b);
});
const nearestStation = nearest[0];
if (nearestStation) {
return nearestStation.name;
}
return "";
};
👆 This is a val. Vals are TypeScript snippets of code, written in the browser and run on our servers. Create scheduled functions, email yourself, and persist small pieces of data — all from the browser.