function type(data, recur) {
if (data === null || data === undefined) {
return "";
} else if (data instanceof HTMLElement || data instanceof SVGElement) {
return data;
} else if (
Array.isArray(data) &&
!Array.isArray(data[0]) &&
!(data[0] instanceof HTMLElement || data[0] instanceof SVGElement) &&
typeof data[0] === "object"
) {
const keys = Object.keys(data[0]);
return [
keys.map(k => html`<b>${k}</b>`),
...data.map(d => keys.map(k => d[k]))
].map(recur);
} else if (Array.isArray(data)) {
return data.map(recur);
} else if (data instanceof Map) {
return Array.from(data).map(([key, value]) =>
recur([html`<b>${key}</b>`, value])
);
} else if (data instanceof Set) {
return Array.from(data).map(recur);
} else if (typeof data === "object") {
return Object.entries(data).map(([key, value]) =>
recur([html`<b>${key}</b>`, value])
);
} else if (typeof data === "number") {
return html`<div style="text-align: right;">${data.toFixed(2)}</div>`;
} else {
return data;
}
}