import * as d3array from 'd3-array';
import sandboxedEval from '../utils/sandbox';
export function commonLayerProps(formData, setTooltip, setTooltipContent, onSelect) {
    const fd = formData;
    let onHover;
    let tooltipContentGenerator = setTooltipContent;
    if (fd.js_tooltip) {
        tooltipContentGenerator = sandboxedEval(fd.js_tooltip);
    }
    if (tooltipContentGenerator) {
        onHover = (o) => {
            if (o.picked) {
                setTooltip({
                    content: tooltipContentGenerator(o),
                    x: o.x,
                    y: o.y,
                });
            }
            else {
                setTooltip(null);
            }
            return true;
        };
    }
    let onClick;
    if (fd.js_onclick_href) {
        onClick = (o) => {
            const href = sandboxedEval(fd.js_onclick_href)(o);
            window.open(href);
            return true;
        };
    }
    else if (fd.table_filter && onSelect !== undefined) {
        onClick = (o) => {
            onSelect(o.object[fd.line_column]);
            return true;
        };
    }
    return {
        onClick,
        onHover,
        pickable: Boolean(onHover),
    };
}
const percentiles = {
    p1: 0.01,
    p5: 0.05,
    p95: 0.95,
    p99: 0.99,
};
/* Get a stat function that operates on arrays, aligns with control=js_agg_function  */
export function getAggFunc(type = 'sum', accessor = null) {
    if (type === 'count') {
        return (arr) => arr.length;
    }
    let d3func;
    if (type in percentiles) {
        d3func = (arr, acc) => {
            let sortedArr;
            if (accessor) {
                sortedArr = arr.sort((o1, o2) => d3array.ascending(accessor(o1), accessor(o2)));
            }
            else {
                sortedArr = arr.sort(d3array.ascending);
            }
            return d3array.quantile(sortedArr, percentiles[type], acc);
        };
    }
    else {
        d3func = d3array[type];
    }
    if (!accessor) {
        return (arr) => d3func(arr);
    }
    return (arr) => d3func(arr.map(x => accessor(x)));
}
//# sourceMappingURL=common.jsx.map